函数用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))

所有其他测试的结果也应该和以前一样。

最新更新