给定一棵树,我想找到从根到每个叶子的路径。查找从树根到叶子的所有路径在方案
所以,对于这种树:
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))))
这比我原来的更整洁。
考虑到它处理具有单个节点的树的方式,这是相当整洁的 - 并且可能更正确:(paths'a)=> ((a)),而(g'a)=>(a)。 CL的地图可以或多或少地等于我的地图2以上?你知道内置的Scheme功能吗? – grifaton 2010-06-11 07:15:58
我对Scheme的了解不多,但我会猜想像mapcan这样的东西可用。不过,也许它被认为很容易实现。你的'map2'原则上看起来是相同的,但是它的尾部调用错误,所以当列表太长时它会打击栈。也许你应该使用累加器/反向习惯用法。 – Svante 2010-06-11 08:33:20
等同于'mapcan'的方案是来自SRFI-1的'append-map'。 – 2010-06-11 12:14:56