Python max recursion,关于sys.setrecursionlimit()的问题

时间:2011-08-16 16:20:18

标签: python recursion

我有一个关于 sys.setrecursionlimit()

的问题

从python docs这个函数:
设置Python解释器堆栈的最大深度以限制。此限制可防止无限递归导致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。

为什么会这样?

3 个答案:

答案 0 :(得分:16)

名字很差。它应该说Stack Depth,而不是Recursion深度。递归意味着它是一遍又一遍的同一个线程,它是限制性的。实际上,你可以拥有100个深度调用的实际代码。我不推荐它,但你可以。他们可以逃脱它,因为在实际的世界中,你遇到这种情况的唯一时间是递归。当你因此崩溃时,看到“Recursion”这个词会让你立即知道要查找的内容而不是“Stack”。

(Stack应该给任何体面的程序员提供相同的线索,但说实话,你的代码只是崩溃了,你想要一个相关的错误信息,对吧?99.99999%的时间这告诉你你搞砸了什么(你错过了你的递归的基本情况。))

答案 1 :(得分:4)

仍然存在Python运行时需要进行的函数调用,甚至可以进入函数。

答案 2 :(得分:4)

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

以5个递归函数为例。每个都进行98次递归调用,最后一次调用是下一个递归函数。如果递归限制为100,您是否真的希望允许每个递归函数进行99次调用,总深度为~500次调用?不,这可能会使翻译人员陷入困境。

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