理解这种递归

时间:2015-02-04 03:29:39

标签: python python-3.x recursion

我不太确定这种递归是如何工作的

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

根据我的理解,该函数接受各自列表中的所有元素,然后添加它们。所以对于第二次调用,它应该是'one'+(2 +“3”)+ 4 +(5 +“six”)。但是,这不应该产生错误,因为你不能对字符串求和?我不确定如何计算答案。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

它计算树上的叶子(表示为列表中的列表)。

如果s是一个列表(它正在查看非叶子节点),它会在每个元素(子树)上调用自身,添加结果并返回总数。

如果s不是列表(它是叶子节点),则返回1(无论s3.5还是5,或"six"1是返回的内容。

答案 1 :(得分:0)

递归的基本情况是" else 1",这是当s不是列表时返回的内容。 sum()被调用c()的递归调用,唯一的非递归返回值是1.因此,它只是求和。

答案 2 :(得分:0)

想想这样的代码:

def count(objects):
    if isinstance(objects, list):
        return sum([count(items) for items in objects])
    else:
        return 1