2015-04-23 64 views
2

我試圖刪除方案R5RS中的流中的重複項。這是我的代碼。刪除流中的重複項(方案)

(define (remove-duplicates lst) 
    (cond ((stream-null?? lst) stream-null?) 
     ((not (memq (stream-car lst) (stream-cdr lst))) 
     (cons-stream (stream-car lst) (remove-duplicates (stream-cdr lst)))) 
     (else (remove-duplicates (stream-cdr lst))))) 

(define (memq item x) 
    (cond ((stream-null?? x) #f) 
     ((eq? item (stream-car x)) x) 
     (else (memq item (stream-cdr x))))) 

我看不出爲什麼這不起作用。任何解決方案或幫助,將不勝感激。

回答

2

「不起作用」是一個非常模糊的問題描述,但我會盡力回答。

memq不是懶惰的,即使是這樣,您也無法測試無限流中的成員身份,原因相對比較明顯。

爲了保持流懶,你不能決定是否應該通過查看「轉發」,只是「倒退」,包括一個項目 - 未來隱藏給你,你只能根據過去的決定。

你需要扭轉的問題 - 而不是除了最後過濾掉所有的情況下,你把第一和過濾掉其餘的,如果任何轉出,當你終於到達那裏存在。
(絡繹不絕,人們很容易,一旦你發現它刪除的東西,但它不可能發現的東西是不存在的。)

stream-filter是用於過濾有用,結果可能看起來像這:

(define (remove-duplicates lst) 
    (if (stream-null? lst) 
     stream-null 
     (stream-cons (stream-car lst) 
        (remove-duplicates 
        (stream-filter (lambda(x) (not (eq? x (stream-car lst)))) 
            (stream-cdr lst)))))) 
+0

感謝您的解釋和解決方案。我終於明白了! – TeaLoverGuy