2016-03-03 44 views
1

我正在寫一個遞歸函數,它接受一個元素A和一個列表L,並返回一個列表等於L,但每次出現的A都被刪除。以下是我已經寫了:遞歸函數不工作'「程序車中錯誤的類型參數」

(define (remove A L) 
    (cond ((eq? A (car L))  (remove A (cdr L))) 
      ((not(eq? A (car L))) (cons (car L) (remove A (cdr L)))) 
      ((null? L)    '()) 
    ) 
) 

編譯和運行,我得到以下錯誤:

/tmp/compile/5c6515d8-e155-11e5-9605-aa00009baa05/input/main.scheme:2:21: In procedure remove: 

/tmp/compile/5c6515d8-e155-11e5-9605-aa00009baa05/input/main.scheme:2:21: In procedure car: Wrong type argument in position 1 (expecting pair):() 

回答

1

我想通了:

需要函數的第一次檢查爲(null? L),因爲carcdr不能在任何空列表上工作。

(define (remove A L) 
    (cond ((null? L)    '()) 
      ((equal? A (car L))  (remove A (cdr L))) 
      ((not(equal? A (car L))) (cons (car L) (remove A (cdr L)))) 
    ) 
) 
+0

'cond'中的最後一種情況應該只是'else'。實際上,一些Scheme實現甚至不允許它成爲其他任何東西。 – mobiuseng