2017-06-04 128 views
-1

我在Common lisp中編程,我需要一個算法刪除具有(至少)兩個公共元素的子列表。Lisp,刪除具有兩個公共元素的子列表

我不知道如何解決問題。我想使用此:

(defun定義除去-重複表(列表)(刪除-重複列表:測試 '等於:鍵' CDR))

但子列表之間的CDR是不同,以及i只是無法弄清楚我如何計算兩個元素並刪除子列表。 另外我需要不刪除的 「原始」 的子表(在本例中「(1 2 3 4))中,只有機器人(2 3 4)和(1 3 4)

實施例:

輸入:'((1 2 3 4)(2 3 4)(5 6 7 8)(1 3 4)(9 9 9 9))

輸出:'((1 2 3 4)(5 6輸入:'(((1.1)(2.2)(3.3)(4.4))((1.1)(2.2)(9.9 9 9))

輸入: )(4。4)))

輸出:'((1.1)(2.2)(3.3)(4.4))

謝謝!

P.s抱歉,如果起初我沒有解釋清楚我的問題,我糾正了很多錯誤。這是我對這個社區的第一個問題,請原諒

+2

從幫助#1「的問題,要求作業幫助必須包括到目前爲止你已經做解決問題的工作的總結,和難度的描述你正在解決它。「 –

+0

是的,謝謝你,到目前爲止我已經完成了我的項目,我唯一難以爲此寫出一個算法。這很容易,但我卡住了。我將添加更多示例 –

+0

您是否嘗試過您的代碼?發生了什麼? –

回答

1

其實你可以用remove-duplicates做到這一點。當至少有兩個元素相似時,您需要創建一個返回true的測試函數。例如。

(defun two-similar-p (lst1 lst2) 
    ...) 

(two-similar-p '(1 2 3) '(1 4 5)) ; ==> nil 
(two-similar-p '(1 2 5) '(1 4 5)) ; ==> t 

使用散列函數是最快最好的時間複雜度,同時遍歷一個列表(length other-list)時間可能是最容易的。然後你就可以解決你的問題是這樣的:

(defun remove-duplicates-list (list) 
    (remove-duplicates list :test #'two-similar-p :from-end t)) 

(remove-duplicates-list '((1 2 3 4) (2 3 4) (5 6 7 8) (1 3 4) (9 9 9 9))) 
; ==> ((1 2 3 4) (5 6 7 8) (9 9 9 9)) 
+0

我會嘗試寫這個函數的代碼(two-similar-p),謝謝你的回答。如果我有任何問題,我會更新這篇文章,也許我會在這裏寫評論 –