Я пытаюсь реализовать рекурсивный поиск произвольного пути (не обязательно цикла), пересекающего все вершины графа с использованием Python. Вот мой код:
def hamilton(G, size, pt, path=[]):
if pt not in set(path):
path.append(pt)
if len(path)==size:
return path
for pt_next in G[pt]:
res_path = [i for i in path]
hamilton (G, size, pt_next, res_path)
Здесь pt
— начальная точка, а path
— список всех ранее пройденных вершин, не включая pt
, по умолчанию пустой. Проблема в том, что всякий раз, когда такой путь найден, оператор return ссылается на какой-то внутренний вызов процедуры, и поэтому программа не завершает работу и не возвращает путь.
Например, возьмите G = {1:[2,3,4], 2:[1,3,4], 3:[1,2,4], 4:[1,2,3]}
(то есть полный 4-граф) и запустите hamilton(G,4,1,[])
. Он возвращает None
, но если вы напечатаете путь вместо того, чтобы возвращать его как значение, вы увидите, что на самом деле он находит все шесть путей, начиная с 1.
Если я скажу программе напечатать путь вместе с оператором return, она в конце концов напечатает все такие пути и, следовательно, будет работать намного дольше, чем нужно.
Как исправить код, чтобы он прекращал выполнение после нахождения первого подходящего пути?