理解这个递归

Understanding this 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 + "three") + 4 + (5 + "six")。但是,这不应该产生错误,因为您不能对字符串求和吗?我不确定答案是如何计算出来的。任何帮助将不胜感激。

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

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

如果s不是一个列表(它是一个叶节点)它returns1(不管s是否是3.5,或者5"six",返回的是 1

递归的基本情况是 "else 1",这就是当 s 不是列表时 returned 的情况。 sum() 在递归调用 c() 时被调用,唯一的非递归 return 值为 1。因此,它只是求和。

想想这样的代码:

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