【发布时间】:2014-07-11 18:33:13
【问题描述】:
我正在尝试获取两个列表的共同元素。
我已经尝试了可用的交集函数和我自己实现的一个,当尝试在(a a ... a) 和(a b c d ... z) 等列表上测试它们时,都给出了同样奇怪的结果。
只要第一个列表多次包含相同的元素,而第二个列表以该元素开头,则结果就是第一个列表。
例如:(intersection '(2 2 2 2) '(2 2 2 3)) 返回(2 2 2 2)
我实现的路口:
(defun presentp (a l)
(cond ((null l) nil)
((and (atom (car l)) (equal a (car l))) t)
((not (atom (car l))) (presentp a (car l)))
(t (presentp a (cdr l)))))
(defun intersectionp (a b)
(cond ((not (and a b)) nil)
((presentp (car a) b) (append (list (car a)) (intersection (cdr a) b)))
(t (intersection (cdr a) b))))
我怎样才能在该类型的列表中获得好的结果?例如,我想要来自(intersection '(2 2 2 2) '(2 2 2 3)) 的(2 2 2)。
【问题讨论】:
-
我正在使用 LispWorks 并且 INTERSECTION 函数在 COMMON-LISP 包中,所以我假设它是 CLISP? screenshot
-
对不起,我有一种想法。在这种情况下,返回
(2 2 2 2)的方法没有任何问题。 (出于某种原因,我在想union。cl:intersection应该返回一个列表,其中包含第一个和第二个列表中的所有元素。如果第一个列表只包含第二个列表中的元素,那么第一个列表正好包含那些同时出现的元素,所以返回第一个列表不是错误。 -
@JoshuaTaylor:在你的第一条评论中,你说它返回了
(2 2 3 2),我认为这是一个错字,你的意思是(2 2 2 2) -
@alecutheman 好的,我知道你已经接受了答案,但是这里发生了一些有趣的事情,值得看看规范要求和允许的内容,所以我已经添加了有关此处实际情况的答案。有趣的是,LispWorks 中的
(intersection '(2 2 2 3) '(2 2 2 2))确实返回了(2 2 2)。
标签: set lisp common-lisp multiset