Это вопрос домашнего задания, я пытаюсь выполнить функцию поиска в глубину в схеме, вот код, который я написал до сих пор:
(define explore
(λ(node visited)
(let* ([neighbors (force (cdr node))]
[next (nextNode visited neighbors)]
[is-visited (member? node visited)])
(cond
;if I have no unvisited neighbours print current node and go up one level
[(equal? next #f)
(begin
(display (car node))
(display " "))]
;if current node is not visited and I have unvisited neighbors
;print current node,mark as visited and visit it's neighbors
[(and (equal? is-visited #f) (not (equal? next #f)))
(begin
(display (car node))
(display " ")
(explore next (cons node visited)))])
;go and visit the next neighbor
(if (not (equal? (nextNode (cons next visited) neighbors) #f ))
(explore (nextNode (cons next visited) neighbors) (cons node visited))))))
'узел' — это текущий узел
'посещенный' — это список, в котором я отслеживаю узлы, которые я посетил
'nextNode' — это функция, которая возвращает первого непосещенного соседа, если он есть, или #f в противном случае
'член?' проверить, находится ли узел в списке посещенных
Представление графа использует соседние, созданные с использованием ссылок на узлы с помощью letrec, поэтому я использую force в «соседях»: например:
(letrec ([node1 (list «NY» (delay (list node2 node3)))], где node2 и node3 определены как node1
Проблема, с которой я сталкиваюсь, заключается в том, что мои посещенные списки теряют след некоторых узлов, которые я посетил, когда я выхожу из рекурсии. Как я могу это исправить?