2016-07-06 50 views
-2

我想回答的問題是: 寫一個函數(在Dr.Racket/Scheme中)稱爲merge,它從兩個玩具列表(玩具1和玩具2)中生成玩具列表。這個產生的名單將包含來自玩具1和玩具2的交替玩具,其中第一個來自玩具1。另外,如果玩具1和玩具2中的第n個玩具是相同的玩具(顏色和類型),則所產生的列表應該僅包含具有該顏色和類型的一個玩具結構(例如不復制)。如果列表長度不同,則列表中的最後一個玩具將成爲較長列表中的最後一個玩具。我們如何編寫一個將兩個列表合併在一起的函數?

使用以下結構來完成這樣一個問題:

(define-struct toy (color type)) 
;; A Toy is a (make-toy Str Str) 

對這一計劃的一個例子是:

(merge (list (make-toy "blue" "ball") (make-toy "blue" "spring") 
    (make-toy "red" "helmet") (make-toy "purple" "band")) 
    (list (make-toy "yellow" "van") (make-toy "blue" "spring"))) 

產生

(list (make-toy "blue" "ball") (make-toy "yellow" "van") 
    (make-toy "blue" "spring") (make-toy "red" "helmet") 
    (make-toy "purple" "band")) 

現在,我已經創建了方案到目前爲止如下:

(define (merge toys1 toys2) 
    (cond 
    [(empty? toys1) toys2] 
    [(empty? toys2) toys1] 
    [else 
     (first toys1) (first toys2) 
     (merge (rest toys1) (rest toys2))])) 

現在我遇到的問題是,我不知道我將如何納入最終列表中刪除重複條件的條件。 任何意見,我會強大的幫助!

+1

對不起,但這看起來像一個家庭作業的要求,這不是StackOverflow的。請自己嘗試解決,如果遇到麻煩,那麼您可以尋求解決問題的幫助。 –

+0

好的,謝謝你讓我知道! – Mark

+0

其實,家庭作業還行,[但](http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions)你應該先嚐試自己解決問題然後詢問您現有的實施情況。 – Noumenon

回答

0

在我看來,有兩種方法可以擺脫重複:

  1. 當你正在構建的列表中,你要確保你是不是在重複值推杆。如果你這樣做,將會發生的是,通過不插入重複的值並將下一個值插入到列表中,可能會混淆交錯兩個列表的順序。但同時,你也確保你得到一個適當的交替列表。
  2. 在您構建完列表後,仔細檢查並刪除重複項。可以通過調用當前函數merge-help,然後創建一個函數merge來刪除merge-help生成的列表中的重複項。這樣做會更容易實現,但不能保證您的列表能夠滿足要求,即不能正確交錯。

解決方案1絕對更繁瑣,但它會給你更好的結果。我的建議是首先從一個名爲remove-dups的函數中刪除任何一個列表中的重複項或者其他類型的項。然後在新更改的列表中,執行您當前的merge,如果您遵循soegaard's的建議,這看起來好像會起作用。

相關問題