为什么这个 DFS 代码只能在生成器中调用它?

Why does this DFS code only work calling it within a generator?

非常感谢您的帮助。我正在研究 DFS 路径,我理解代码,但我不理解的是最后一行。为什么我不能将函数称为 dfs_paths(graph, 'A', 'F') 而不是 list(dfs_paths(graph, 'A', 'F')) 下面的代码可以工作吗?谢谢。

graph = {'A': set(['B', 'C']),
         'B': set(['A', 'D', 'E']),
         'C': set(['A', 'F']),
         'D': set(['B']),
         'E': set(['B', 'F']),
         'F': set(['C', 'E'])}

def dfs_paths(graph, start, goal):
    stack = [(start, [start])]
    while stack:
        (vertex, path) = stack.pop()
        for next in graph[vertex] - set(path):
            if next == goal:
                yield path + [next]
            else:
                stack.append((next, path + [next]))

dfs_paths(graph, 'A', 'F')

因为 dfs_paths 不是常规函数;这是一个生成器函数。当您 运行 函数时,它只是 return 一个生成器,并且在您开始迭代 return 值之前不会实际执行主体中的任何代码。该迭代可以通过 for 循环明确表示:

for path in dfs_paths(graph, 'A', 'F'):
    ...

或通过像 list 这样使用迭代器的函数隐式:

paths = list(dfs_paths(graph, 'A', 'F'))

是函数中的yield语句

其中包含 yield 的方法是生成器。生成器 return 调用时的迭代器。如果您想获得完整的 return 值(整个路径),您必须完成对迭代器的迭代。因此需要 list() - 隐式迭代迭代器,为您提供整个路径。