Lisp 检查元素是否在树中

Lisp 检查元素是否在树中,lisp,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 TR

我需要用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。但是当我用这个例子测试我的代码时,我不断得到一个错误,它说“未定义的函数N使用参数调用
((23))
”:
(TREE-CONTAINS 2'(1 2 3))
。当然这里N应该是1,但我不知道为什么它认为N是一个函数。有什么想法吗?

在调用
树包含的
或任何lisp函数时,不应在参数周围包含括号。它是
(函数名arg1 arg2)
,而不是
(函数名(arg1 arg2))


因此,首先,删除调用
(tree contains(n(car tree)))
参数周围的括号,就像这样:
(tree contains n(car tree))
。类似地,对
树的下一次调用在该
子句中包含
。除此之外,最后一个条件:
(t TREE-CONTAINS(N(CDR TREE))
应该这样调用:
(t(TREE-CONTAINS N(CDR TREE)))

也可以使用
{}
对代码进行格式化,并且可以在文本中的代码加上反标记,例如,`
code
`,以获得格式化。当你用括号括起一个名字时,你把它当作一个函数来调用<代码>(+12)
调用
+
。除了试着打电话给
N
,你觉得
(N(CDR树))
会怎么样?谢谢,我明白你的意思了。但是当我去掉CDR树周围的括号时,我得到了未绑定的CDR。我很确定
(CDR树)
是正确的,但它不应该是
n
的参数。您可能熟悉algol语言,因此您所做的工作就像Java中的
n(cdr(tree))
。。但是当cdr是一个函数时,
n
不是。