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

Lisp实现无重复合并两列表函数求助(仅用eql、member)

问题分析与修正

你的代码存在两个核心问题:

  • 语法错误:没有使用cond包裹条件分支,Lisp中直接写((null x) y)会被解析为尝试调用(null x)返回的布尔值作为函数,这显然不合法。
  • 逻辑错误:
    1. 当(car x)不在y中时,没有将该元素添加到递归结果中,导致元素丢失;
    2. 当(member (car x) y)为真时直接返回x,会跳过x后续元素的处理,逻辑不完整。

修正后的代码

(defun merge-lists (x y)
  (cond
    ((null x) y)
    ((member (car x) y)
     (merge-lists (cdr x) y))
    (t
     (cons (car x) (merge-lists (cdr x) y)))))

代码说明

  • 当x为空时,直接返回y,此时所有x的元素已处理完毕,剩余的y就是需要补充的部分;
  • 如果x的第一个元素存在于y中,说明该元素会在y中出现,无需重复添加,递归处理x的剩余元素与y;
  • 如果x的第一个元素不在y中,就用cons将该元素加到递归处理结果的前面,确保x中所有独有的元素被保留。

测试调用:

(merge-lists '(1 2 3 4 5) '(4 5 6 7 8))

输出结果:(1 2 3 4 5 6 7 8),完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:25:15