我正在尝试编写递归深度优先搜索算法,该算法采用表示图形的邻接列表并打印顶点的访问顺序 .
我的输入是存储为邻接列表的图形:
graphAL2 = {0 : [1,2,3],
1 : [0,3,4],
2 : [0,4,5],
3 : [0,1,5],
4 : [1,2],
5 : [2,3] }
从那里,我编写了2个函数,一个主函数和一个辅助函数,组成了程序 .
import sys
def main():
count = 0
graphAL2v = {}
for key, value in graphAL2.items():
graphAL2v[key] = 0
print graphAL2v
for key in graphAL2v:
if key == 0:
dfs(key, count, graphAL2v)
def dfs(v, count, graph):
count = count + 1
graph[v] = count
for key in graph:
if key == 0:
dfs(key, count, graph)
if __name__ == "__main__":
sys.exit(main())
现在,如果我运行它,输出是:
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
{0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
并且与键0配对的第一个值一直递增,直到a
RuntimeError: maximum recursion depth exceeded
到达了 . for循环应该遍历其余的键对值,并将值更改为顶点被访问的顺序,但我不确定它为什么不这样做 .
有什么想法吗?
1 回答
问题出在您的
dfs()
函数中,您没有检查该节点是否已被访问过,您正在检查该节点是否0
在if
条件下if key == 0:
,因此它会继续递归0
节点,即使它已被访问过 .由于
0
节点的这种无限递归,当达到最大递归限制时,它会弹出错误 -RuntimeError: maximum recursion depth exceeded
.您应该从图形
检查
key` 的值,而不是图表本身 . 并且您也没有在任何地方使用邻接列表 . 您应该根据邻接列表循环,而不是访问的字典 .示例 -
演示 -