微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于在列表 LISP 中找到给定数字的相同数字的问题

如何解决关于在列表 LISP 中找到给定数字的相同数字的问题

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

(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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。