基准情况是头号嫌疑
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 栈推过限制,让进程以段错误崩溃而不是干净异常。短暂提高用于诊断可以;作为修复上线不行。修复基准情况、添加环检测或改用迭代遍历,然后用比原失败更深的输入验证。