中间导致递归DFS函数 - Python

时间:2017-08-10 07:42:13

标签: python recursion depth-first-search

我基本上试图通过这个例子更好地理解递归。让我们看一下下面的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如何知道这些中的哪一个是函数的实际输出?它只是最后一个吗?

1 个答案:

答案 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]少一行。