LISP中如何从列表中删除指定原子的所有出现?
解决LISP中删除列表所有指定原子的问题
嘿,刚接触LISP的话,这种递归处理列表的问题确实容易踩小坑~我看了你的代码,问题出在cond分支的逻辑和语法上,咱们一步步来改:
首先先指出你代码里的几个小错误:
- 第二个
cond分支的判断条件写错了:(EQ (car LAT) A car LAT)这里多了个car LAT,正确的判断应该是(eq (car LAT) A) - 当匹配到目标原子A时,你原来的分支没有继续递归处理剩余列表,反而返回了
car LAT(也就是A本身),这就导致只处理了第一个匹配项就停了 - 代码里还有个多余的逗号:
rematom, A,LISP里不需要这种逗号分隔参数
接下来是修正后的完整代码:
(defun rematom (A LAT) (cond ((null LAT) ()) ; 递归终止条件:列表为空时返回空列表 ((eq (car LAT) A) (rematom A (cdr LAT))) ; 当前元素是要删除的A,跳过它,继续递归处理剩余列表 (t (cons (car LAT) (rematom A (cdr LAT)))) ; 当前元素不是A,保留它,再拼接剩余列表处理后的结果 ) )
现在测试一下你给的例子:
(rematom 'a '(a b c a d a))
执行后就会得到你期望的(B C D)啦~
简单解释下逻辑:每次递归都检查列表的第一个元素:
- 如果列表空了,就返回空,结束递归
- 如果第一个元素是要删的A,就直接对剩下的列表(
cdr LAT)继续递归,相当于跳过了当前的A - 如果不是A,就把这个元素用
cons拼接到剩余列表处理后的结果前面,这样就保留了非A的元素
内容的提问来源于stack exchange,提问作者Kumar Anand
相关产品推荐
相关产品推荐

