为什么这个 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()
- 隐式迭代迭代器,为您提供整个路径。
非常感谢您的帮助。我正在研究 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()
- 隐式迭代迭代器,为您提供整个路径。