添加visited字典后仍触发maxRecursionDepth递归深度超限报错问题
问题原因
- 核心错误:每次进入
BackAndForth递归函数时,都会遍历全图节点将visited字典所有值重置为False,直接清空了上层递归标记的已访问节点状态。例如初始调用从节点0出发,标记0为已访问,递归进入邻接点2时,函数第一行就把所有访问标记重置,此时节点0的访问状态变回未访问,遍历2的邻接点时会再次触发以0为起点的递归,形成0→2→0→2的无限递归循环,最终触发递归深度超限报错。 - 附加逻辑问题:使用全局变量
count和visited,且没有回溯逻辑,即使修复无限递归问题,最终统计的路径数也会出错,不同递归分支的状态会互相干扰。
解决方案
修改核心逻辑如下:
- 将
visited字典的初始化逻辑移到递归函数外,仅在最外层调用前执行一次,不要在递归过程中重置全量访问标记。 - 递归探索完当前节点的所有邻接分支后,将当前节点的访问标记恢复为
False(回溯操作),保证其他路径可以正常访问该节点。 - 移除全局变量
count,改为通过递归返回值累加路径数,避免全局变量状态污染。
修正后的可运行代码如下:
def BackAndForth(AList, current, end2, visited): # 到达终点时返回1条有效路径 if current == end2: return 1 count = 0 # 标记当前节点已访问 visited[current] = True # 遍历所有邻接点探索路径 for neighbor in AList[current]: if not visited[neighbor]: count += BackAndForth(AList, neighbor, end2, visited) # 回溯:恢复当前节点未访问状态,供其他路径使用 visited[current] = False return count Alist = { 0 :[2,3,6], 1 :[3,5,6] , 2 :[0,3,4], 3 :[0,1,2,4], 4 :[2,3,5], 5 :[1,4,6], 6 :[0,1,5], } end1 = 0 end2 = 1 # 仅初始化一次访问标记字典 visited = {node: False for node in Alist.keys()} print(BackAndForth(Alist, end1, end2, visited))
内容的提问来源于stack exchange,提问作者Maheedhar A
相关产品推荐
相关产品推荐

