2013-05-03 62 views
1

我是新來的方案和做一些練習。我正在嘗試執行以下操作: 我要寫的函數帶有一個列表參數(不需要輸入檢查)。然後它會消除多個元素的出現並返回新列表。下面是一個例子輸入輸出:讓我們調用函數「一次」,如何在方案中編寫以下功能

=>(once '(1 2 5 2 3 4 2 4 1 2)) 
=>Value: (1 2 5 3 4) 

這裏是我的解決方案:

(define once 
    (lambda (lst) 
    (if (null? lst) 
     '() 
     (if (member (car lst) (cdr lst)) 
      (once (cdr lst)) 
      (cons (car lst) (once (cdr lst))))))) 

但元素的順序被改變雖然消除重複。誰能幫忙? 感謝

回答

1

如果您不想在結果中添加來自lst的項目,

(define (once lst) 
    (let looking ((lst lst) (rst '())) 
    (if (null? lst) 
     (reverse rst)     ; leave order unchanged 
     (let ((nxt (car lst))) 
      (looking (cdr lst) 
        (if (member nxt rst) ; nxt in rst 
         rst    ; yes: don't augment rst 
         (cons nxt rst))))))) 
1

球拍,它是如此簡單:

(define once remove-duplicates) 
(once '(1 2 5 2 3 4 2 4 1 2)) 
=> '(1 2 5 3 4) 

但如果你必須從頭開始實現它,這裏的總體思路,填充了空白:

(define (once lst) 
    (cond (<???> ; is the list empty? 
     <???>) ; return the empty list 
     (<???> ; is the current element member of the rest of the list? 
     <???>) ; advance recursion 
     (else ; otherwise it's not duplicate, 
     (cons <???>  ; cons current element 
       <???>)))) ; advance recursion 
+0

這是一個內置函數嗎?謝謝,但我試圖自己寫。 – yrazlik 2013-05-03 22:05:31

+0

@bigO是的,它內置在球拍中。如果您需要自己實現它,則很簡單:遍歷列表,詢問當前元素是否是列表中其餘部分的「成員」。如果它是成員,則繼續使用列表的cdr(它是重複的)。如果它不是一個成員,那就說它(它不是重複的)。無論哪種方式,推進遞歸 – 2013-05-03 22:14:16

+0

@bigO我更新了一些提示我的答案 – 2013-05-03 22:18:04

1

在處理輸入列表時,列表頭部有一個元素,列表的剩餘尾部有一個元素。

  1. 如果列表頭部的元素位於尾部,則不需要將其添加到結果中,因爲它將在稍後的迭代中捕獲。
  2. 如果列表頭部的元素不在尾部,則將其推送到結果中。
  3. 遞進。
2
(define once L 
(if (null? L) 
    '() 
    (cons (car L) (once (filter (n-eq-x? (car L)) (cdr L)))))) 

(define (n-eq-x? value) 
(lambda (x) (if (eq? value x) #f #t))) 

,你可以用一個輔助

(define (once L) 
(reverse (once-helper L '()))) 

(define (once-helper L L-once) 
(cond ((null? L) L-once) 
     ((member? (car L) (L-once) 
     (once-helper (cdr L) L-once)) 
     (else (once-helper (cdr L) (cons (car L) L-once))))) 

更接近原始的寫,這裏的區別是,而不是建設有沒有出現在元素的列表列表的其餘部分,您將創建第二個列表,其中包含尚未成員的原始元素。如果您已經擁有該元素,則該檢查將變爲false,而不是在稍後獲取該元素時爲false。