Это вопрос домашней работы, я пытаюсь выполнить функцию поиска в глубину в схеме, вот код, который я написал до сих пор:
(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 в противном случае
'Член? проверка наличия узла в списке посещений
Представление Graph использует соседние объекты, созданные с использованием ссылок на узлы с помощью letrec, поэтому я использую силу в 'соседях':
Например:
(letrec ([узел1 (список «NY») (задержка (список узел2, узел3)))], где узел2 и узел3 определены как узел1
Проблема, с которой я сталкиваюсь, заключается в том, что мои посещенные списки теряют отслеживание некоторых узлов, которые я посетил, когда я выходил из рекурсии. Как я могу это исправить?