Почему этот код DFS работает, вызывая его только в генераторе? - PullRequest
0 голосов
/ 31 марта 2019

Буду очень признателен за вашу помощь.Я изучаю пути 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')

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Это выражение yield в функции.

Методы с yield в них являются генераторами.Генераторы возвращают итератор при вызове.Если вы хотите получить полное возвращаемое значение (весь путь), вы должны закончить итерацию по итератору.Отсюда необходимость в list() - который неявно перебирает итератор, давая вам весь путь.

1 голос
/ 31 марта 2019

Потому что dfs_paths не является обычной функцией;это функция генератора.Когда вы запускаете функцию, она возвращает только генератор и фактически не выполняет никакого кода в теле, пока вы не начнете перебирать возвращаемое значение.Эта итерация может быть явной через цикл for:

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

или неявной через функцию типа list, которая использует итератор:

paths = list(dfs_paths(graph, 'A', 'F'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...