Python最大递归,关于sys.setrecursionlimit()的问题

27 投票
3 回答
17453 浏览
提问于 2025-04-16 23:42

我有一个关于 sys.setrecursionlimit() 的问题。

根据Python的文档,这个函数的作用是:
设置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 个回答

4

这个限制是基于整个调用栈的深度,而不是某个特定函数的深度。当你第一次调用 rec() 时,栈的深度可能已经是 5 了。

举个例子,假设有 5 个递归函数。每个函数会调用自己 98 次,最后一个函数会调用下一个递归函数。如果递归的限制是 100,你真的想让每个递归函数都调用 99 次,这样总深度会达到大约 500 次调用吗?不,这样可能会让解释器崩溃。

所以,递归的限制是所有函数的最大深度,而不是某个特定的函数。

5

即使是要调用你的函数,Python运行时也还是需要进行一些函数调用。

23

这个名字起得不好。应该叫“栈深度”,而不是“递归深度”。因为“递归”这个词让人觉得是同一个线程在不断重复调用。实际上,你的代码可能会有100层的调用,这种情况是可能发生的。虽然我不推荐这么做,但确实可以做到。在实际情况中,只有在递归的时候你才会遇到这种情况。当你的程序因为这个崩溃时,看到“递归”这个词能让你立刻想到该检查什么,而不是“栈”。

(其实“栈”这个词也应该能给任何一个合格的程序员提供相同的提示,但说实话,你的代码崩溃了,你肯定希望看到一个相关的错误信息,对吧?99.99999%的情况下,这个信息能准确告诉你哪里出错了(你漏掉了递归的基本情况)。)

撰写回答