这两个函数之间有什么区别?为什么会导致无限递归?

时间:2015-01-14 07:38:08

标签: python

def flatten(S):
    result = []
    for item in S:
        if is_listlike(item) and not is_listlike(item[0]):
            result.append(item)
        else:
            result.extend(flatten(item))
    return result

def flat(S):
    if S == []:
        return S
    if isinstance(S[0], list):
        return flat(S[0]) + flat(S[1:])
    return S[:1] + flat(S[1:])

当我打电话给flat(listoflists)时,它似乎抛出了

RuntimeError: maximum recursion depth exceeded while calling a Python object

但是当我拨打flatten(listoflists)时,它可以正常工作。

我想知道上面两个函数之间的区别是什么,它们应该展平嵌套的列表列表,但flat()有时会抛出错误消息而flatten()从不抱怨。

2 个答案:

答案 0 :(得分:2)

问题是flat()是递归的。它不会导致无限递归,但它可能超过最大递归深度,列表足够大。 Python没有实现尾递归优化,所以即使列表没有嵌套列表,也可以轻松达到最大深度。

另一方面,flatten()主要是迭代的。它仅在遇到嵌套列表时才会递归,因此它也可以通过正确的输入达到最大深度。如果您打算使用大型列表,这是一个更合适的解决方案。

答案 1 :(得分:0)

第二个函数是递归函数,python具有最大递归深度限制。您可以使用以下代码来增加限制。

import sys
sys.setrecursionlimit(2000)