Нахождение пути между 2 точками в ракетке
У меня есть следующий список подключений:
(define routelist
(list
(list'a 'b)
(list'a 'c)
(list'b 'e)
(list'b 'f)
(list'b 'c)
(list'a 'd)
(list'e 'f)
(list'f 'g)))
Маршруты между 'a и' g должны быть найдены. На этой странице показано решение в Прологе:http://www.anselm.edu/homepage/mmalita/culpro/graf1.html
Я мог бы справиться со следующим решением, хотя оно итеративное:
(define (mainpath routelist start end (outl '()))
(if (equal? start end)
(println "Same start and end points.")
(for ((item routelist))
(when (equal? start (list-ref item 0))
(set! outl (cons start outl))
(if (equal? end (list-ref item 1))
(begin
; PATH FOUND:
(set! outl (cons end outl))
(println (reverse outl)))
(begin
(mainpath (rest routelist) (list-ref item 1) end outl)
(set! outl (rest outl))))))))
(mainpath routelist 'a 'g)
Выход:
'(a b e f g)
'(a b f g)
Как достичь функционального решения в Racket?