0

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

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

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

+1

См. Http://stackoverflow.com/a/4655846/69663 - поэтому одним из способов было бы, чтобы ваша функция dfs возвращала не только возможно-найденное значение, но и набор узлов, которые были посещены до сих пор. – unhammer

+0

Вы должны проверить https://hackage.haskell.org/package/fgl, он реализует очень элегантный способ работы с графиками, которые я не мог понять, но, похоже, похож на молнии. –

ответ

1

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

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