Lisp:List1与List2的差异

3

我对Lisp还比较陌生,试图解决找到两个列表的差异的问题。需要在列表2中找到所有不在列表1中的数字。

希望得到(diff list1 list2)...例如:(diff '(4 5 6 8 9) '(1 2 4 6 8 9)) 返回结果为(1 2)

目前我已经有了:

(defun diff (l1 l2) 
  (cond ((null l1) nil) 
        ((member (first l1) l2) (diff(rest l1) l2)) 
        (t (cons (first l2) (diff (rest l2) l1)))))


(defun diff1 (l1 l2)
  (cond ((null l1) nil) 
        ((member (first l2) l1) (diff (rest l2) l1)) 
        (t (cons (first l2) (diff (rest l2) l1)))))

我尝试过两种不同的方法,但似乎无法让其返回List 2而非List 1。


24
请不要在别人回答完你的问题后删除它。 - Mysticial
这个问题应该被删除,因为它基于一个打字错误,并且对未来的搜索者没有任何用处。 - jscs
1个回答

4

您在diff的最后一行中有一个拼写错误:

(defun diff (l1 l2)
  (cond ((null l2) nil) 
        ((member (first l2) l1) (diff l1 (rest l2))) 
        (t (cons (first l2) (diff l1 (rest l2))))))

请注意,一旦您正确格式化代码,缺陷就很明显 :-)
另外,您正在寻找的函数已经以Common Lisp中的set-difference命名存在。

我尝试过这个方法,但没有得到我想要的返回值。set-difference 可以用于 list1 与 list2 的差集,但我要的是相反的。也就是 list2 对 list1 的差集。同时还需要遵循模式 (diff list1 list2)。 - user2899108
@user2899108:好的,已经修复了你反转的参数顺序。 - sds
谢谢你们迄今为止的帮助。我从这段代码得到的结果是(1 2 5 4 6 8 9)。它应该只是(1 2)。因为1和2是唯一与另一个数字不同的数字。还是卡住了... - user2899108
@user2899108:请现在尝试。 - sds
(defun your-diff (list1 list2) (set-difference list2 list1)) 有哪些限制? - Svante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接