我在阅读关于深度优先搜索的内容(这里),想知道为什么我们不返回递归调用的值。这可能听起来很奇怪,因此下面是包含问题注释的代码:
def depthFirst(node, soughtValue, visitedNodes):
if node.value == soughtValue:
return True
visitedNodes.add(node)
for adjNode in node.adjacentNodes:
if adjNode not in visitedNodes:
if depthFirst(adjNode, soughtValue, visitedNodes): # why this?
return True
return False
我的问题是:替换下面的内容是否可行:
if depthFirst(adjNode, soughtValue, visitedNodes):
return True
使用
return depthFirst(adjNode, soughtValue, visitedNodes):
通过提前评估为False来缩短搜索吗?问题中的这些行似乎在说,跟随当前的adjNode并查看是否导致解决方案; 如果是,则我们将从叶子返回一系列True语句,一直到搜索的起点(我们当前的adjNode); 这会一直发生到根(搜索的开始和第一个递归调用)。只有这样我们才能说我们找到了有效的路径并返回“True”。
似乎第一个return语句触发了“True”语句链,并且我们在循环内离开搜索。我正确吗?这里发生了很多事情,任何进一步的说明都将不胜感激。