You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归调用开销:为何setrecursionlimit设置值未被完全利用?

递归深度限制问题解析

调用栈开销的产生

每次调用basicpower时,Python都会在调用栈里新建一个栈帧——这就像个临时存储区,装着当前函数的局部变量、执行位置标记(方便子函数执行完后返回继续计算)、参数值等信息。每递归一层就新增一个栈帧,这些栈帧持续累积占用内存,这就是调用栈开销的来源。直到触发n==0的基例,栈帧才会逐层销毁释放内存。

为什么设了100却用不满?

sys.setrecursionlimit(100)是给整个Python解释器设置的全局最大递归深度,但这100个名额不会全留给你的basicpower函数:

  • 运行脚本时,Python已经提前占用了几个栈帧——比如导入sys模块、执行顶层代码、调用print函数的操作,都会占用1-2个栈深度名额。
  • 再看你的递归调用次数:调用basicpower(2,98)时,从n=98递归到n=0,一共要执行99次函数调用(加上最开始的初始调用,总栈深度会接近100)。Python在每次递归调用前会检查当前深度,一旦触及设置的上限,就会抛出RecursionError。

举个实际的例子:如果初始栈深度是2,那basicpower最多只能递归98次(2+98=100),但n=98需要99次递归调用,自然就超过了限制。

验证与调整思路

你可以用以下代码查看当前初始栈深度:

import sys
def get_current_stack_depth():
    depth = 0
    frame = sys._getframe()
    while frame:
        depth += 1
        frame = frame.f_back
    return depth

print(get_current_stack_depth())  # 通常会输出2或3

如果想让n=98正常运行,要么把递归限制稍微调高(比如设为105),要么改用迭代实现幂函数——毕竟Python默认不支持尾递归优化,深递归本来就不是它的优势场景。

内容的提问来源于stack exchange,提问作者Hossam Hamza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:55:28