这里有一个尾部递归函数:

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.这只是堆栈溢出吗?有办法绕过它吗?

推荐答案

是的,它可以防止堆栈溢出.Python(或者更确切地说,CPython实现)不会优化尾递归,并且无节制的递归会导致堆栈溢出.您可以使用sys.getrecursionlimit判断递归限制:

import sys
print(sys.getrecursionlimit())

将递归限制改为sys.setrecursionlimit:

sys.setrecursionlimit(1500)

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

Python不是函数式语言,尾递归也不是一种特别有效的技术.如果可能的话,迭代地重写算法通常是一个更好的 idea .

Python相关问答推荐

计算相同形状的两个张量的SSE损失

通过优化空间在Python中的饼图中添加标签

Python在tuple上操作不会通过整个单词匹配

Select 用a和i标签包裹的复选框?

删除最后一个pip安装的包

运行Python脚本时,用作命令行参数的SON文本

Julia CSV for Python中的等效性Pandas index_col参数

Python虚拟环境的轻量级使用

如何在给定的条件下使numpy数组的计算速度最快?

ThreadPoolExecutor和单个线程的超时

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

名为__main__. py的Python模块在导入时不运行'

使用Python从rotowire中抓取MLB每日阵容

寻找Regex模式返回与我当前函数类似的结果

重置PD帧中的值

在代码执行后关闭ChromeDriver窗口

Pythonquests.get(Url)返回Colab中的空内容

极点用特定值替换前n行

如何在基于时间的数据帧中添加计算值