(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))))
)
)
首先,讓我們正確格式化:
(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)))))
如果您使用的一種形式兩次,要改變這種狀況,那麼你需要存儲的值。 LET是這樣的構造。如果它不適合一個COND,那麼你需要第二個COND。
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
(t (let ((list3 (remove (car list1) list2 :count 1)))
(cond ((eq list2 list3) nil)
(t (samesetP (cdr list1) list3)))))))
現在,EQ不能用於比較列表。使用EQUAL。
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
(t (let ((list3 (remove (car list1) list2 :count 1)))
(cond ((equal list2 list3) nil)
(t (samesetP (cdr list1) list3)))))))
COND是矯枉過正這裏,使用IF:
(defun samesetp (list1 list2)
(if (null list1)
(null list2)
(let ((list3 (remove (car list1) list2 :count 1)))
(if (equal list2 list3)
nil
(samesetP (cdr list1) list3)))))
現在,你只需要進行功能做什麼被要求在作業。但無論如何,這是你的家庭作業。
你應該使用哈希表,這將會擊垮距離O複雜性(N^2)到O(n)。 – leppie 2011-02-08 07:19:17
我很困惑。你正在使用一種可怕的算法,並且只要不涉及修復壞算法,就需要改進。爲什麼?正如@leppie所說的,使用哈希表。或者對兩個列表進行排序,並行排列。更好的算法會比您所關心的微優化帶來更多的不同。 – btilly 2011-02-08 07:30:58
讓傢伙冷靜下來,我們不允許使用散列表。這是家庭作業問題的一部分。如果你能想到一個更有效的算法,可以包含在約10行代碼中,請賜教。 – 2011-02-08 09:09:44