如何从 LISP 列表中删除所有数字

问题描述 投票:0回答:1

我正在学习 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 必须使用条件。我的递归哪里出了问题/缺少什么?

recursion lisp nested-lists
1个回答
0
投票

这不是很明显吗?分开

atomp
(实际上可以与
null
情况统一)和
listp
(然后可以简单地是
t
)情况。不过,请考虑一下顺序。请记住,数字也是原子。

© www.soinside.com 2019 - 2024. All rights reserved.