我基本上试图通过这个例子更好地理解递归。让我们看一下下面的DFS算法,该算法返回连接到基本根节点的所有节点。在这种情况下,“图形”被定义为顶点之间边缘元组的列表。
def dfs(graph,node,dfs_visited):
if node not in dfs_visited:
dfs_visited.append(node)
#find next node to go
potential_paths = [i for i in graph if node in i]
new_nodes = [node_ for path in potential_paths for node_ in
path if node_ !=node]
for n in new_nodes:
dfs(graph,n,dfs_visited)
return dfs_visited
例如,如果图表是
graph = [(0, 1),(0, 2),(1, 2),(3, 4),(4,5)]
从节点0开始的结果是
dfs(graph,0,[])
[0,1,2]
在这种情况下我感到好奇的是,这只是一次递归调用的“返回”结果。显然代码按照我的意图工作,结果很好,但我很好奇中间“返回”的地方。例如,当我们在return语句之前使用添加的print语句运行相同的函数时,我们得到以下输出:
dfs(graph,0,[])
returning [0, 1]
returning [0, 1, 2]
returning [0, 1, 2]
returning [0, 1, 2]
returning [0, 1, 2]
returning [0, 1, 2]
returning [0, 1, 2]
那么Python如何知道这些中的哪一个是函数的实际输出?它只是最后一个吗?
答案 0 :(得分:1)
在这行中递归调用函数:
for n in new_nodes:
dfs(graph,n,dfs_visited)
是嵌套调用的返回值结束的地方。你没有将这个值赋给任何变量,所以python只要它继续下一次迭代就会忘记它。您应该使用以下打印语句(几乎)获得与上面打印的输出相同的输出:
for n in new_nodes:
ret = dfs(graph,n,dfs_visited)
print(ret)
(例外情况是您的初始通话返回的值,但不会打印出来。所以您应该比[0, 1, 2]
少一行。