2014-09-22 85 views
1

我需要做一個函數,我發送一個值,並檢查列表中是否有相同的值來刪除它。下面是一些例子:SCHEME從列表中刪除原子值

(elimina 1 '(a b c))   => (a b c) 
(elimina 'b '(a (b) c))   => (a() c) 
(elimina 1 '(0 (1 (2) 1) 0)) => (0 ((2)) 0) 

我嘗試這樣做:

(define (elimina v1 lista) 
    (cond ((null? lista)'()) 

     ((list? (first lista)) 
     (list (elimina v1 (first lista)))) 

     (else 
     (if(equal? v1 (first lista)) 
      (elimina v1 (cdr lista)) 
      (append (cons (first lista) (elimina v1 (cdr lista)))))) 
    ) 
) 

我的結果,其中這樣的:

(elimina 1 '(a b c))   => (a b c) 
(elimina 'b '(a (b) c))  => (a()) 
(elimina 1 '(0 (1 (2) 1) 0) => (0 ((2))) 

由於某些原因,名單上的最後一個值不顯示。希望有人能幫忙。

謝謝!

回答

0

1)你的問題是在這裏:

((list? (first lista)) 
     (list (elimina v1 (first lista)))) 

當你遞歸到子列表,你不處理列表的其餘部分了。

2)此外,

(append (cons (first lista) (elimina v1 (cdr lista)))))) 

可以簡化,因爲要追加一個列表,什麼都沒有,所以剛落append

3)不是錯誤,但我建議你使用要麼firstsecondrest ... carcadrcdr ...

嘗試:

(define (elimina v1 lista) 
    (cond 
    ((null? lista) '()) 
    ((list? (first lista)) 
    (cons (elimina v1 (first lista)) (elimina v1 (rest lista)))) ; <= (1) 
    (else 
    (if (equal? v1 (first lista)) 
     (elimina v1 (rest lista)) 
     (cons (first lista) (elimina v1 (rest lista)))))))  ; <= (2) 
+0

謝謝非常! – 2014-09-23 00:41:58