Учитывая дерево, я хочу найти пути от корня к каждому листу.
Итак, для этого дерева:
D
/
B
/ \
A E
\
C-F-G
имеет следующие пути от корня (A) к листьям (D, E, G):
(A B D), (A B E), (A C F G)
Если я представлю дерево выше как (A (B D E) (C (F G)))
, тогда функция g
сделает свое дело:
(define (paths tree)
(cond ((empty? tree)
'())
((pair? tree)
(map (lambda (path)
(if (pair? path)
(cons (car tree) path)
(cons (car tree) (list path))))
(map2 paths (cdr tree))))
(else
(list tree))))
(define (map2 fn lst)
(if (empty? lst)
'()
(append (fn (car lst))
(map2 fn (cdr lst)))))
Но все это выглядит неправильно. Мне не приходилось думать об этом какое-то время, но я чувствую, что должен быть более аккуратный способ сделать это. Любые идеи для лучшего решения (на любом языке) будут оценены.
РЕДАКТИРОВАТЬ. Сопоставление решения Svante со схемой дает:
(define (paths tree)
(if (pair? tree)
(append-map (lambda (node)
(map (lambda (path)
(cons (car tree) path))
(paths node)))
(cdr tree))
(list (list tree))))
который намного аккуратнее, чем мой оригинал.