我一直在思考这个问题,但我无法自己解决这个问题。给定一个n-ary树和一个节点,找到路径,在lisp(我使用常见的lisp,但它的任何版本都可以)给定一个节点。一个n-ary树就像这个:(root (subtree1) (subtree2) (subtree3) ...)
,例如(A (B (C) (D)) (E (F) (G)) (H (I) (J)))
就像这样表示:
A
/ | \
B E H
/\ /\ /\
C D F G I J
鉴于三个(A (B (C) (D)) (E (F) (G)) (H (I) (J)))
和节点F
,结果应为:(A E F)
。
P.S。:我已经使用map
函数搜索了一个解决方案,但我发现只有没有map
函数的递归解决方案。
答案 0 :(得分:2)
这是一个使用mapcan
和一起使用递归的设计解决方案:
(defun path (tree leaf)
(cond ((null tree) nil)
((eq (car tree) leaf) (list leaf))
(t (mapcan (lambda (subtree)
(let ((p (path subtree leaf)))
(when p (cons (car tree) p))))
(cdr tree)))))