我得到了一个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的调用。此时,递归一直沿着图形向下移动,直到它到达没有子节点或目标节点的节点。如果它到达的节点没有子节点不是目标,则忽略基本情况,并忽略整个for循环,返回值none。那么None就是简单地传递递归链。如果它到达目标节点,那么递归的底层实际上返回一个值(路径),该值冒泡到递归的顶部。
那时我感到很困惑,因为“最短”会发生什么。因此,每次为newPath返回实际值时,都会为shortest分配该值,但随后会将其添加到path。但是,假设我有多个目标节点路径。我成功找到了第一条路径,路径等于所有newPaths / shortests的总和。但是,对于成功达到目标的下一次递归,路径是否只是继续添加更多newPaths?那么最终的结果是不是我可以访问目标节点而不是最短路径的每条路径的长列表?
答案 0 :(得分:3)
path
变量是函数的本地变量。每个递归调用都有自己的堆栈帧 - 它独立于其他调用)。这意味着当下一个电话开始时,一切都是全新的。