我收到了一个DFS算法,它返回到达目标节点的最短路径。它需要作为参数传入一个图(包含所有节点及其路径)、一个起始节点、一个目标节点和一个已访问节点列表(初始为空)。以下是代码:
def shortestPath(graph, start, end, visited = []):
path = str(start)
if start == end:
return path
shortest = None
for node in graph.childrenOf(start):
if str(node) not in visited:
visited = visited + [str(node)]
newPath = shortestPath(graph, start, end, visited)
if newPath = None:
continue
if shortest == None or len(newPath) < shortest:
shortest = newPath
if shortest != None:
path = path + shortest
else:
path = None
return path
我理解深度优先搜索的概念,但这个递归让我很困惑。请告诉我我是否正确理解,并指出我偏离正轨的地方。
基本上,当newPath被赋值一个值时(当然是调用shortestPath),递归发生了。此时,递归会一直到达图形的底部,直到它到达没有孩子或目标节点为止。如果到达了不是目标的无子节点,则会忽略基本情况和整个循环,返回none。然后,将该none简单地传递给递归链。如果到达目标节点,则递归的底层实际上返回一个值(路径),该值向上冒泡到递归的顶部。
在那一点上,我感到困惑,因为“shortest”的作用是什么。所以,每次为newPath返回一个实际值时,都会将该值分配给shortest,然后添加到path中。但是,假设我有多条通往目标节点的路径。我成功找到第一条路径,而路径等于所有newPaths/shortests的总和。但是,对于下一次成功到达目标的递归,path不是只会继续添加更多newPaths吗?因此,最终结果会是每条可能到达目标节点的路径列表,而不是最短路径吗?