2015-02-04 3 views
1

Я не слишком уверен, как это работает рекурсияПонимание этой рекурсии

def c(s): 
    '''Docstring omitted.''' 
    return sum([c(i) for i in s]) if isinstance(s, list) else 1 

Я не понимаю, как следующие ответы производятся

>>> c(['one', 2, 3.5]) 
3 
>>> c(["one", [2, "three"], 4, [5, "six"]]) 
6 

В моем понимании, функция принимает все элементов в их соответствующих списках, а затем добавляет их. Поэтому для второго вызова это должно быть «один» + (2 + «три») + 4 + (5 + «шесть»). Однако не должно возникнуть ошибка, поскольку вы не можете суммировать строку? Я не уверен, как были рассчитаны ответы. Любая помощь будет оценена.

+0

Для того, чтобы понять рекурсию, что вам нужно понять рекурсию :) – alecxe

ответ

2

Он подсчитывает листья на дереве (в виде списков в списках).

Если s - это список (он смотрит на нелистовой узел), он называет каждый элемент (поддерево), добавляет результаты и возвращает итоговое значение.

Если s не список (это листовой узел) возвращает 1 (независимо от того, является s3.5 или 5 или "six", 1 является то, что получает возвращается).

0

Базовый регистр рекурсии - это «else 1», это то, что возвращается, когда s - это что-то иное, чем список. sum() вызывается при рекурсивных вызовах c(), единственное нерекурсивное возвращаемое значение которого равно 1. Следовательно, это просто суммирование.

0

Think кода, как это:

def count(objects): 
    if isinstance(objects, list): 
     return sum([count(items) for items in objects]) 
    else: 
     return 1 
Смежные вопросы