Предполагая, что узел 'a имеет дочерние элементы' (bcde), узел 'b имеет дочерние элементы' (ac), узел ... Сначала вам понадобится функция, которая расширяет узел до его дочерних элементов.
(define (expand graph node)
(let ((c (assq node graph)))
(if c (cdr c) '())))
Второе: вы должны запомнить все посещенные узлы.В общем, шляпа отличается от пути (возможно, это не имеет значения в этом примере).Третье: вам нужно запомнить все узлы, которые вы хотите посетить (результат процесса расширения узла).Поэтому определите вспомогательную функцию
(define (dfs* graph visited border path dest)
Если не осталось ни одного узла для посещения, значит, дороги не существует.
(cond ((null? border) #f)
Если первый элемент на границе равен нашему месту назначения, томы счастливы
((eq? (car border) dest) (cons (car border) path))
Давайте проверим все посещенные узлы.Если первый узел в границе был посещен ранее, тогда продолжайте без расширения узла
((memq (car border) visited)
(dfs* graph visited (cdr border) path dest))
В противном случае разверните первый узел границы
(else (dfs* graph
(cons (car border) visited)
(append (expand graph (car border)) (cdr border))
(cons (car border) path)
dest))))
Вызовите эту вспомогательную функцию с начальными значениями для посещения, границыи путь:
(define (dfs graph src dst)
(dfs* graph '() (list src) '() dst)
Для первого поиска дыхания: добавьте расширенный узел в конце границы
Редактировать: a) посещенные и пути совпадают, вы можете удалить один из них b) путь возвращается в обратном порядке в) Процедура неверна, путь содержит все посещенные узлы.Но постобработка результата dfs * сделает эту работу.