Как предотвратить циклы при использовании чисто функционального поиска в глубину

У меня есть граф, который реализован как список ребер, соединяющих произвольные узлы, с типами данных, определенными ниже.

type edge = int * int;;
type graph = edge list;;

Как мне выполнить чисто функциональный поиск в глубину, избегая при этом застревания в цикле? Я не совсем уверен, как отслеживать все посещенные узлы, оставаясь при этом чисто функциональным. Ответ, вероятно, является чем-то тривиальным, что я по какой-то причине концептуально не понимаю.


person Zhehao Chen    schedule 27.10.2015    source источник
comment
См. stackoverflow.com/a/4655846/69663 - так что одним из способов было бы, чтобы ваша функция dfs возвращала не только возможно -Найдено-значение, но и Набор посещенных узлов.   -  person unhammer    schedule 27.10.2015
comment
Вы должны проверить hackage.haskell.org/package/fgl, он реализует очень элегантный способ для работы с графиками, которые я не совсем понял, но, похоже, они похожи на застежки-молнии.   -  person Niklas B.    schedule 27.10.2015


Ответы (1)


Функция поиска имеет параметр, который отслеживает посещенные узлы. В FP одна из идей заключается в том, что вы можете продолжать коллировать все глубже и глубже (с хвостовыми коллами). Таким образом, вы можете передавать параметр через все вызовы, добавляя новые узлы по ходу дела.

Еще одним параметром могут быть узлы, которые вы планируете посетить позже. Для DFS это будет работать как стек.

person Jeffrey Scofield    schedule 27.10.2015