2012-11-25 62 views
1

這是我第一次發佈,我對計劃有疑問。 我必須從列表中刪除某個元素的所有事件,通過既作爲參數, 當進入參數那樣:刪除計劃中的列表中的元素

]=> (rmobject '(1 2 3 5 0 2 3 5 3) 3) 

我得到一個錯誤:

The object (3 5 3 2 3 6 3) is not applicable 

我猜想這是因爲第二個lambda,這是不正常,但爲什麼?

(define (rmobject list1 obj) 
    (if (null? list1) 
     '() 
     (if (= obj (car list1)) 
      ((lambda (list1) (cdr list1)) list1) 
      ((lambda (list1) (list1)) list1))) 
     (cons (car list1) (rmobject (cdr list1) obj))) 

我重寫了代碼,這適用於刪除元素,但正確的沒有,並且都假設是相同的。在此先感謝

(define (rmobject list1 obj) 
    (if (null? list1) 
    '() 
    (if (= obj (car list1)) 
     (rmobject (cdr list1) obj) 
     (cons (car list1) (rmobject (cdr list1) obj))))) 
+0

'((拉姆達(列表1(列表1))列表1))))'將導致錯誤 – leppie

回答

2

代碼中的第一個版本並沒有太大的意義。爲什麼用這種方式使用lambda?你應該遞歸地調用與正在定義的相同的程序,而不是創建一次性匿名程序,這對於解決手頭的問題不起作用。而這部分:(list1)導致錯誤The object is not applicable:您試圖調用列表,就好像它是一個過程 - 因爲它被括號包圍。請記住,在Scheme中,像這樣的語法:(foo)指示要調用foo過程

代碼的第二個版本很好,這是實現remove-all過程的簡單方法。然而,有些挑剔的是:當你發現自己嵌套if時,這肯定表明cond會更合適。另請注意,這是一個好主意,用equal?代替=,在這樣的過程將更多的工作不僅僅是數字:

(define (rmobject list1 obj) 
    (cond ((null? list1) 
     '()) 
     ((equal? obj (car list1)) 
     (rmobject (cdr list1) obj)) 
     (else 
     (cons (car list1) 
       (rmobject (cdr list1) obj))))) 

以供將來參考:你實現它的過程的一般包括爲部分口譯員。例如,在拍我們有remove*,它採用equal?作爲測試平等的默認程序:

(define (rmobject list1 obj) 
    (remove* (list obj) list1)) 

此外,您還可以使用filter作爲@麥克斯韋的答案。另一種方式來寫它:反正

(define (rmobject list1 obj) 
    (filter (negate (curry equal? obj)) list1)) 

,這個工程:

(rmobject '(1 2 3 5 0 2 3 5 3) 3) 
=> '(1 2 5 0 2 5) 
1

的問題是,在該行((lambda (list1) (list1)) list1)))您撰寫的是接受一個參數(list1),然後您可以嘗試作爲一個函數來調用一個函數。因爲該函數實際上是通過了一個列表,解釋器會退出並顯示錯誤。

正如你在第二次嘗試中發現的那樣,通過lambda編寫函數不是必須的,或者使用你提出的算法是連貫的。即便如此,還有很多技術比你在第二次嘗試中使用的技術簡單得多。我將演示一個實際上使用lambda的方法,以便了解它是如何工作的。替代技術我指的是依賴於filter和作品,像這樣:

(define (rmobject list1 obj) 
    (filter (lambda (x) (not (equal? x obj))) list1))