我正在学习 LISP,遇到一个问题,我必须从列表中删除所有数字,该列表也有嵌套列表。例如:
(删除-NUM'(2 A(3 B)C D))
将输出:
(A(B)C D)
我不被允许使用loop、if或mapcan。我将使用基本运算符和 cond 语句。这是我当前的代码:
(defun REMOVE-NUM (L)
(cond
((null L) nil)
((numberp (car L))(REMOVE-NUM (cdr L)))
(t (cons (car L)(REMOVE-NUM (cdr L))))
)
我当前的代码可以删除没有嵌套列表的数字原子,但是一旦涉及嵌套列表,它就会列出嵌套列表,而不实际处理它。我知道这是我的递归背后的逻辑的问题,但由于某种原因我看不到它。我的直觉是将最后一行更改为:
(t (cons (REMOVE-NUM (car L) (REMOVE-NUM (cdr L))))
最后一行中的另一个递归调用,但这样做会产生错误,因为它尝试获取原子的 car 并将其作为列表传递给我的函数,该函数只能获取列表。我想也许改变基本情况,但我想不出办法这样做,因为 numberp 必须使用条件。我的递归哪里出了问题/缺少什么?
这不是很明显吗?分开
atomp
(实际上可以与 null
情况统一)和 listp
(然后可以简单地是 t
)情况。不过,请考虑一下顺序。请记住,数字也是原子。