python堆栈是否会随着递归过程执行的迭代过程而增长?

时间:2011-05-09 03:13:26

标签: python tail-recursion tail-call-optimization

我知道Python不支持尾调用优化。这是否意味着具有迭代过程的递归过程(如下面定义的阶乘)将消耗O(n)内存,或者没有延迟操作的事实意味着空间将是O(1)?

def factorial(n, accum=1):
    if n == 0:
        return accum
    else:
        return factorial(n-1, accum * n)

2 个答案:

答案 0 :(得分:5)

内存为O(n)。如果python优化了这种情况,那么在递归中发生的异常就不会有完整的堆栈跟踪。您只需使基本案例引发异常就可以自己测试它,并且您将看到完整的堆栈跟踪。

答案 1 :(得分:2)

没有尾部调用优化意味着您需要在递归调用返回之前将堆栈保留在内存中,因此在我看来,在这种情况下内存使用量将为O(n)。

如果你想自己检查一下,只需运行你的n大值的示例代码(使用sys.setrecursionlimit)并检查top中的内存使用情况就可以说服你这不是O(1)。