Lisp实现无重复合并两列表函数求助(仅用eql、member)
问题分析与修正
你的代码存在两个核心问题:
- 语法错误:没有使用
cond包裹条件分支,Lisp中直接写((null x) y)会被解析为尝试调用(null x)返回的布尔值作为函数,这显然不合法。 - 逻辑错误:
- 当
(car x)不在y中时,没有将该元素添加到递归结果中,导致元素丢失; - 当
(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
相关产品推荐
相关产品推荐

