递归函数的工作原理

The working principle of a recursive function

提问人:유한정 提问时间:11/8/2023 更新时间:11/8/2023 访问量:22

问:

亲爱的,
提前谢谢你。
我的问题是关于DFS算法的。
我的代码和结果如下。

  1. 法典
graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]
visited = [False]*9

def dfs(graph, v, visited):
  visited[v] = True
  #print(v, end='')
  for i in graph[v]:
    print("i:",i,"v:",v)
    if not visited[i]:
      print("no")
      dfs(graph,i,visited)
  1. 结果
i: 2 v: 1
no
i: 1 v: 2
i: 7 v: 2
no
i: 2 v: 7
i: 6 v: 7
no
i: 7 v: 6
i: 8 v: 7
no
i: 1 v: 8
i: 7 v: 8
i: 3 v: 1
no
i: 1 v: 3
i: 4 v: 3
no
i: 3 v: 4
i: 5 v: 4
no
i: 3 v: 5
i: 4 v: 5
i: 5 v: 3
i: 8 v: 1
  1. 我的问题
    我不明白“访问所有连接节点后返回父节点的过程”。例如,节点 6 只有一个连接的节点,即 7,既然我们已经探索了 7,那么它不应该在不执行 'if not visited[i]' 下的语句的情况下结束吗?我预计探索会在达到 1-2-7-6 (i: 7 v: 7) 后完成,但结果与我的猜测不同。我不确定为什么会显示下一个输出。
python 堆栈 深度优先搜索

评论


答:

0赞 JonSG 11/8/2023 #1

当您访问节点 6 并将您引导至已访问的节点 7 时,该调用将结束。但是,something called 和 that something 是先前调用的循环。现在,for循环将继续下一个要检查的项目,依此类推......dfs(graph, 6, visited)dfs(graph, 6, visited)fordfs(graph, 8, visited)

使用调试器单步执行代码使其更易于理解。如果您这样做,我建议将手表设置为:

v
i
visited[v]
visited[i]
graph[v]