在列表LISP中查找给定数字的相同数字的问题



所以我试图接受两个参数,一个列表和一个数字,当且仅当该数字等于列表中的任何元素时返回true

(defun find-num(a z)
(if (= z (car a)) (write t))
(if (not(= z (car a))) (find-num (cdr a)) )
(if (not(= z (car a))) (write f) )
)
(find-num '(1 2 3 4 5) 5)

所以我认为代码会执行这样的步骤如果z等于a,则返回true,如果z不等于a,则写入f(返回false(或跳到递归函数中,该函数在列表的其余部分中查找数字,直到找到相同的数字

然而,我收到这样的错误

VAL/APPLY: Too few arguments (1 instead of at least 2) given to
FIND-NUM

我不确定是不是哪个部分搞砸了

我试图使用cond语句,但也收到了相同的错误

(defun find-num(a z)
(cond
( (= z (car a)) (write t) )
( (not(= z (car a))) (find-num (cdr a)) ) 
( (not(= z (car a))) (write f) )
)
)
(find-num '(1 2 3 4 5) 5)

错误消息很清楚,不是吗?

给FIND-NUM 的参数太少(1而不是至少2(

您使用一个参数调用函数FIND-NUM,但该函数需要两个参数。您的函数具有参数az。两个。但是您的递归调用是(find-num (cdr a))。这只是一个论点:(cdr a)的值。

另一个问题是:f不是Lisp中false的值。f是一个未定义的变量。评估(not t),看看Lisp中的false值到底是什么。

CL-USER > (not t)     

结果可能是什么?

接下来,您需要检查函数是否返回正确的结果。

(defun find-num (arr num)
(cond ((null arr) nil)              ;; if no arr element equals num -> nil
((= (car arr) num) t)         ;; if first element of array equals num -> t
(t (find-num (cdr arr) num)))) ;; otherwise search in rest of arry for num

最新更新