【问题标题】:Python max recursion, question about sys.setrecursionlimit()Python 最大递归,关于 sys.setrecursionlimit() 的问题
【发布时间】:2011-08-16 16:20:17
【问题描述】:

我有一个关于 sys.setrecursionlimit()

的问题

来自pythondocs这个函数:
设置Python解释器栈的最大深度为limit。此限制可防止无限递归导致 C 堆栈溢出和 Python 崩溃。 可能的最高限制取决于平台。当用户有一个需要深度递归的程序和一个支持更高限制的平台时,她可能需要将限制设置得更高。这应该小心执行,因为过高的限制会导致崩溃。

这是我的问题:

我们来看看这个没用的递归函数:

def rec(N):
     if N==0:
         return 1
     else:
         return rec(N-1);

现在让我们将最大递归设置为 100:

sys.setrecursionlimit(100)

如果我尝试rec(99)(100 次递归调用),我会得到:

RuntimeError: maximum recursion depth exceeded

要计算rec(99),我需要将递归限制设置为 105。

为什么会这样?

【问题讨论】:

    标签: python recursion


    【解决方案1】:

    名字不好。它应该说堆栈深度,而不是递归深度。递归意味着它一遍又一遍地限制相同的线程。实际上,您可能拥有只有 100 次深度调用的实际代码。我不会推荐它,但你可以。他们可以侥幸逃脱,因为在实际世界中,您遇到这种情况的唯一一次是递归。当你因此崩溃时,看到“递归”这个词会给你一个直接的线索,让你知道要寻找什么而不是“堆栈”。

    (堆栈应该给任何体面的程序员同样的线索,但老实说,你的代码刚刚崩溃,你想要一个相关的错误消息,对吗?99.99999% 的时间这会告诉你你搞砸了什么(你错过了你的递归的基本情况。))

    【讨论】:

    • 谢谢,我想我应该更仔细地阅读定义而不是看函数的名称
    【解决方案2】:

    Python 运行时仍然需要调用函数才能访问您的函数。

    【讨论】:

      【解决方案3】:

      它基于总堆栈深度,而不是任何特定单个函数的深度。当您第一次调用 rec() 时,您可能已经处于 5 的堆栈深度。

      以 5 个递归函数为例。每个都进行 98 次递归调用,最后一次调用下一个递归函数。递归限制为 100,您真的要允许每个递归函数进行 99 次调用,总深度约为 500 次调用吗?不,这可能会使解释器在那些深度崩溃。

      因此递归限制是全局所有函数的最大深度,而不是任何单个命名函数。

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 2015-01-13
        • 2021-11-01
        • 2021-08-03
        • 2021-07-07
        • 2015-09-25
        • 2013-11-01
        • 1970-01-01
        • 2021-09-22
        相关资源
        最近更新 更多