【问题标题】:Does the python stack grow with an iterative process that is executed by a recursive procedure?python 堆栈是否随着递归过程执行的迭代过程而增长?
【发布时间】:2011-05-09 03:13:26
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    内存将是 O(n)。如果 python 优化了这种情况,那么在递归深处发生的异常不会有完整的堆栈跟踪。您可以通过让基本案例引发异常来自己测试它的作用,您将看到完整的堆栈跟踪。

    【讨论】:

    • 即` raise Exception("Result ",accum)`
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2020-05-15
      • 2013-06-19
      • 2019-02-10
      • 2020-12-21
      • 2018-12-29
      • 2020-07-20
      • 2017-01-19
      • 1970-01-01
      相关资源
      最近更新 更多