我一直在想这个问题,但我自己想不出来给定一个n元树和一个节点,在lisp(我使用的是common lisp,但它的任何版本都可以)中查找到给定节点的路径。n元树如下:(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)
附:我用map函数寻找了一个解,但我只找到了没有map函数的递归解。

最佳答案

下面是一个使用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)))))

10-07 19:07
查看更多