我们能否增加Python解释器的栈帧容量?

25 浏览
0 Comments

我们能否增加Python解释器的栈帧容量?

我有这个尾递归函数:

def recursive_function(n, sum):
    if n < 1:
        return sum
    else:
        return recursive_function(n-1, sum+n)
c = 998
print(recursive_function(c, 0))

它可以工作到 n=997,然后它就崩溃了并输出 RecursionError: maximum recursion depth exceeded in comparison。这只是堆栈溢出吗?有没有办法解决它?

admin 更改状态以发布 2023年5月23日
0
0 Comments

看起来你只需要增加递归深度限制

import sys
sys.setrecursionlimit(1500)

0
0 Comments

它是防止栈溢出的一种方法,是的。Python(或者说CPython的实现)不会优化尾递归,而不受限制的递归会导致栈溢出。你可以使用sys.getrecursionlimit来检查递归限制:

import sys
print(sys.getrecursionlimit())

并可以使用sys.setrecursionlimit来改变递归限制:

sys.setrecursionlimit(1500)

但这样做是危险的 - 标准的限制有点保守,但Python堆栈帧可能很大。

Python不是一种函数式语言,尾递归也不是一种特别高效的技术。如果可能,将算法重写为迭代形式通常是一个更好的想法。

0