我正在尝试编写一个比较两个列表的函数,看它们是否代表相同的集合.这是'(a b c d d)与'(d c b a d)代表同一组.元素可以是任何顺序.
这就是我所拥有的,它有效:
(defun samesetp (list1 list2)
(cond
((null list1) (null list2))
((eq list2 (remove (car list1) list2 :count 1)) nil)
(t (samesetP (cdr list1) (remove (car list1) list2 :count 1))))))
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个的原因(remove (car list1) list2 :count 1))是计算两次 - 一次测试remove操作是否真正删除了任何东西,一次递归测试列表的其余部分没有.
任何人都可以提出一种方法来改善这一点,而不使用不同的算法