Lisp会员节点在树中

时间:2015-01-04 19:26:27

标签: tree lisp common-lisp

我需要一个函数来测试表示为(root list_of_nodes_subtree1 ... list_of_nodes_subtreen)的N树中节点的成员资格。例如,如果树是(a (b (c)) (d) (e (f)))而节点是b,那么我们期望得到一个真值。

我尝试了一些地图功能,但我无法解决这个问题。我对lisp很新。一些解释对我来说意味着世界。

1 个答案:

答案 0 :(得分:1)

试试:

(defun check (element tree &key (test #'eq))
  "The tree is simply a nested list."
  (cond
   ;; If the tree is empty
   ((null tree)
    nil)
   ;; If the tree is a list
   ((listp tree)
    (or
     ;; Recurse on the head of the list.
     (check element (car tree) :test test)
     ;; Recurse on the tail of the list.
     (check element (cdr tree) :test test)))
   ;; If the tree is just a node
   (t
    (funcall test element tree))))

;; Testing
(loop for el in '(a b c d e f g) collect
  (check el '(a (b) (c (d) (e)))))

请注意,我默认使用eq而不是equal,因为我们正在比较同一个包的符号,但您可以使用任何您想要的比较功能。