Python技术迷

Python 中递归的最大次数是多少?如何突破?

很多同学第一次写递归的时候,可能没注意过 Python 其实对递归次数是有个天花板的,而且这个限制并不是编译器的 bug,而是解释器刻意加的“安全锁”。我们先聊聊这个锁是怎么回事,再看怎么绕过去。

默认的最大递归深度

Python 里如果你递归太深,会直接抛一个 RecursionError,提示 maximum recursion depth exceeded。 默认这个最大深度大概是 1000 层,具体值跟版本、平台可能有细微差别,可以这样查:

import sys
print(sys.getrecursionlimit())  # 默认是 1000

举个很极端的例子,你写个简单的递归函数:

deffoo(n):
return foo(n - 1) + 1if n > 0else0

foo(2000)  # 基本必炸

Python 会帮你掐掉,因为递归太深可能会导致栈溢出(stack overflow),解释器直接保护性终止。

改变递归限制的方法

如果你真的有需求,可以用 sys.setrecursionlimit() 调整这个值,比如改到 3000:

import sys
sys.setrecursionlimit(3000)

但是要注意,这个值不是随便能调到几十万的,因为底层调用栈还是操作系统分配的内存,如果调太大,反而会更快地引发系统级崩溃(直接 Python 进程被杀掉,甚至整个程序段错误退出)。

更安全的突破思路

如果只是因为写算法,比如深度优先搜索树、图,或者处理嵌套结构,递归深度会爆,可以考虑用 显式栈 来改成迭代版本,这样不会受递归深度限制影响。例如把递归 DFS 改成迭代:

defdfs_iterative(start_node):
    stack = [start_node]
    visited = set()
while stack:
        node = stack.pop()
if node in visited:
continue
        visited.add(node)
# 处理节点
        print(node)
# 加入相邻节点
        stack.extend(get_neighbors(node))

这样无论数据多深,只要内存够,你都能跑完。

尾递归优化的“坑”

很多语言(比如 Scheme、某些 C 编译器)有尾递归优化(Tail Recursion Optimization),能把尾递归转成循环,避免栈增长。但 Python 没有,即便是尾递归写法,也会照样增加调用栈,所以不要寄希望于写成尾递归就能突破限制。

总结一句

  • 默认递归上限:约 1000 层,可 sys.getrecursionlimit() 查看。
  • 临时突破:sys.setrecursionlimit(n),但风险是内存溢出、段错误。
  • 根本解决:改成迭代或使用显式栈结构。
  • Python 没有尾递归优化,所以别指望“尾递归写法”能省栈。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领