← 中文资源

简体中文版本

Python — RecursionError: maximum recursion depth exceeded

找出缺失或不可达的基准情况,把深递归改为显式栈,而不是用提高递归上限代替修复。

阅读英文原文

基准情况是头号嫌疑

RecursionError 表示函数调用自身次数超过解释器限制。回溯重复同一栈帧,指向递归但没说明原因。打印参数或添加深度计数器。如果参数永远到不了基准情况,递归是无界的;如果到了但输入比限制更深,算法需要显式栈。

def depth(node):
    if node is None:
        return 0
    return 1 + depth(node.left)  # missing right branch is a logic bug,
                                 # but a cycle or a very deep tree is the usual depth problem

环与共享节点

图和对象树可能包含环。没有 visited 集合的递归遍历会一直循环到限制。为图记录已访问 id,或为可能重复出现节点的树携带路径集合。修复不是更大的限制,而是停止重复访问。

把深递归改为迭代

对长列表或深层嵌套文档,使用显式栈:

def walk(root):
    stack = [root]
    seen = set()
    while stack:
        node = stack.pop()
        if node is None or id(node) in seen:
            continue
        seen.add(id(node))
        yield node
        stack.extend(node.children)

这样内存放在堆上,避开解释器递归限制,并让环处理显式化。有些算法用递归表达更自然;输入较浅时递归没问题。选择应取决于输入深度,而不只是风格。

不要把提高上限当修复

sys.setrecursionlimit(100000) 可能把 C 栈推过限制,让进程以段错误崩溃而不是干净异常。短暂提高用于诊断可以;作为修复上线不行。修复基准情况、添加环检测或改用迭代遍历,然后用比原失败更深的输入验证。