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

LISP 中的函数用 NIL 替换列表/子列表中的每个非数字

如何解决LISP 中的函数用 NIL 替换列表/子列表中的每个非数字

我正在尝试自学 LISP 编程。我在编写用 NIL 替换列表或子列表中的每个非数字的 LISP 函数时遇到了困难。

例如,如果我输入 (REPLACE '(4 0 4)) 它应该返回 (4 0 4)。 如果我输入 (REPLACE '(1 2 SHOE (3 4 DOOR))) 它应该返回 (1 2 NIL (3 4 NIL))

我有点卡住了……这要怎么做?任何帮助将不胜感激!

编辑:不幸的是,我没有太多,但到目前为止,我有

(defun REPLACE (L)
    (cond ( (NUMBERP L) 

我知道我需要使用 NUMBERP 检查列表中的每个元素是否是一个数字。如果有人能帮我解释如何从这里开始,这样我就可以进步,那就太有帮助了。

解决方法

您需要分步解决问题:

用 nil 替换非数字的函数:

(defun (nil-non-number v)
  ...)

(nil-non-number 3) ; ==> 3
(nil-non-number 'q) ; ==> nil
(nil-non-number "test") ; ==> nil

迭代列表并对每个元素使用 nil-non-number 的函数:

(defun replace-non-nums (lst)
  ...)

(replace-non-nums '())                    ; ==> nil 
(replace-non-nums '(4 0 4))               ; ==> (4 0 4)
(replace-non-nums '(4 a 4))               ; ==> (4 nil 4)
(replace-non-nums '(1 2 shoe (3 4 door))) ; ==> (1 2 nil nil)

作为最后一步,您需要在测试非数字之前添加对 cons 的测试,如果是,您还应该为该列表调用 replace-non-nums 并使用那里的返回作为元素。然后你可以再次测试最后一个:

(replace-non-nums '(1 2 shoe (3 4 door))) ; ==> (1 2 nil (3 4 nil))

所有其他测试也应该产生与以前相同的结果。

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