使用MAP函数从根到给定节点的Lisp路径

时间:2017-01-10 19:40:24

标签: tree lisp

我一直在思考这个问题,但我无法自己解决这个问题。给定一个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函数的递归解决方案。

1 个答案:

答案 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)))))