检查元素是否在树中

时间:2017-10-05 23:06:56

标签: lisp

我需要在Lisp中编写一个函数来检查元素N是否在树中。

(defun TREE-CONTAINS (N TREE)
    (cond ((equal TREE nil) nil)
        ((listp (CAR TREE)) (or (TREE-CONTAINS(N (CAR TREE))) 
                                (TREE-CONTAINS(N (CDR TREE)))))
        (t (cond ((equal N (CAR TREE)) t)
                  (t TREE-CONTAINS(N (CDR TREE)))))
    )
)

例如,(TREE-CONTAINS (1 ((1 2 3) 4 5)))将返回true。但是当我用这个例子测试我的代码时,我一直收到一条错误,上面写着“用参数((2 3))调用的未定义函数N”:(TREE-CONTAINS 2 '(1 2 3))。当然N在这里应该是1,但我不知道它为什么认为N是一个函数。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在对tree-contains或任何lisp函数的调用中,不应在参数周围包括括号。它是(function-name arg1 arg2),而不是(function-name (arg1 arg2))

首先,删除调用(tree-contains(n (car tree)))的参数周围的括号,如下所示:(tree-contains n (car tree))。同样,对于tree-contains子句中的or的下一次调用。此外,最后一个条件:(t TREE-CONTAINS(N (CDR TREE)))应该像这样调用:(t (tree-contains n (cdr tree)))