You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)啦~

简单解释下逻辑:每次递归都检查列表的第一个元素:

  1. 如果列表空了,就返回空,结束递归
  2. 如果第一个元素是要删的A,就直接对剩下的列表(cdr LAT)继续递归,相当于跳过了当前的A
  3. 如果不是A,就把这个元素用cons拼接到剩余列表处理后的结果前面,这样就保留了非A的元素

内容的提问来源于stack exchange,提问作者Kumar Anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:34:39