Учитывая дерево, я хочу найти пути от корня до каждого листа.
Итак, для этого дерева:
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)))))
Но это выглядит неправильно. Некоторое время мне не приходилось так думать, но я чувствую, что должен быть более аккуратный способ сделать это. Буду признателен за любые идеи для лучшего решения (на любом языке).
РЕДАКТИРОВАТЬ - Отображение решения Сванте в Схеме дает:
(define (paths tree)
(if (pair? tree)
(append-map (lambda (node)
(map (lambda (path)
(cons (car tree) path))
(paths node)))
(cdr tree))
(list (list tree))))
что намного аккуратнее моего оригинала.