python报recursionerror是因为默认递归深度限制约1000层,超限即抛出异常;常见于无终止条件的树遍历、无限递归或最坏情况快排;可通过sys.setrecursionlimit()谨慎上调,但更推荐改为迭代实现。

为什么Python会报RecursionError: maximum recursion depth exceeded
这不是代码逻辑错,而是Python主动“踩了刹车”——它默认只允许约1000层函数调用嵌套。一旦递归调用(比如自己调自己)超过这个数,就抛出RecursionError。常见于:树/图深度遍历没设终止条件、误写的无限递归、或处理超长列表的递归算法(如快速排序最坏情况)。
怎么临时调高递归限制(sys.setrecursionlimit())
能用,但不推荐无脑加。Python用C栈管理递归,设太高可能直接导致解释器崩溃(Segmentation fault),尤其在Windows或内存受限环境。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 先查当前限制:
import sys; print(sys.getrecursionlimit())(通常为1000) - 谨慎上调:比如处理深度2000的树,可设
sys.setrecursionlimit(2500),留点余量 - 必须在程序开头设,且最好只在明确需要时才改——别放在递归函数内部
- 注意:该设置是全局的,会影响所有后续递归行为
更稳妥的解法:把递归改成迭代
绝大多数递归逻辑都能用栈或队列重写,既避开深度限制,又更省内存。关键不是“去掉递归”,而是模拟调用栈。
- 例如递归版DFS:
def dfs(node): if not node: return; process(node); dfs(node.left); dfs(node.right) - 改成迭代:
stack = [root]; while stack: node = stack.pop(); process(node); if node.right: stack.append(node.right); if node.left: stack.append(node.left) - 注意子节点入栈顺序(决定遍历方向),以及是否需标记已访问(防环)
- 对尾递归(最后一步才是递归调用),有时可用循环+变量更新替代,无需栈
检查是不是真需要递归,还是写错了终止条件
大量RecursionError其实源于低级错误,而不是数据真的深。
- 检查递归函数的base case是否覆盖所有退出路径,比如
if n 漏了<code>n为负数的情况 - 确认每次递归调用都在向base case靠近,比如
factorial(n-1)写成factorial(n)就死循环 - 打印前几层调用参数:
print("depth:", depth, "n:", n),快速定位卡在哪 - 对输入做防御:比如
if len(data) > 10000: raise ValueError("Too deep"),比硬扛崩溃更友好
setrecursionlimit治标不治本,得顺着调用栈往回挖。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










