2013-10-14 55 views
0
(define fun3 
    (lambda (item list) 
    (cond ((equal? item (car list))) 
      ((fun3 item (cdr list))) 
      (else #f)))) 

我想知道什麼是錯誤的,如果我輸入一個不在列表中的元素。在那裏顯示一個錯誤。 --mcar: expects argument of type <mutable-pair>; given()「mcar:期望<mutable-pair>類型的參數; ()「在類成員函數中

+0

我輸入(fun3'w(list'a'b))來執行此操作,但它顯示如上所述的錯誤。其他明智的,如果它發現的元素,那麼沒有錯誤。 –

+0

另請參閱http://stackoverflow.com/q/664288/1281433。 –

回答

1

當你到達列表的末尾時會發生什麼?像(1 2 3)名單實際上是利弊細胞鏈:

(1 2 3) == (1 . (2 . (3 .()))) 

您獲得使用car.左側的東西,並使用cdr正確的事情。想想當你在(1 2 3)與您的代碼搜索4會發生什麼:

(define fun3 
    (lambda (item list) 
    (cond ((equal? item (car list))) 
      ((fun3 item (cdr list))) 
      (else #f)))) 

最終你改乘的情況下item是(仍然)4,並list(3 .())。現在,將調用(fun3 item (cdr list)),然後item將(仍然)爲4,但list將爲()。您不能撥打(car()),因爲()不是cons cell。你需要明確檢查list是空單的情況:

(define fun3 
    (lambda (item list) 
    (cond ((null? list) <...>) 
      ((equal? item (car list))) 
      ((fun3 item (cdr list))) 
      (else #f)))) 

現在,有兩點需要注意:

  1. 這可以顯著簡化。使用一些布爾邏輯,你甚至可以完全擺脫cond(有關如何的一些想法,請參見Scheme, search if a word is a part of list)。這裏的一般觀點是,你正在做一些類似於C代碼

    if (condition) { 
        return false; 
    } 
    else { 
        return true; 
    } 
    

    這樣可以大大簡化爲return !condition;。你看到你的代碼與此類似嗎?特別是,你的第二種情況是(fun3 item (cdr list))。如果這是真的,那麼你返回true。如果它是錯誤的,那麼你去下一個案例,並返回false。這意味着您可以簡單地返回(fun3 item (cdr list))的值。

  2. 更重要的問題是,你說你想檢查item是否是列表或任何其子列表的成分,但是,你的代碼現在(待有關檢查空列表修復)只檢查是否itemlist的成員,而不是其任何子列表。當item不等於(car list)時,可能是因爲(car list)是另一個列表,您需要遞歸併檢查item是否在其中。你可能會通過查看search through nested list in scheme to find a number來獲得幫助,但它不會告訴你究竟是該怎麼做。
+0

非常感謝好友。有我的錯。請記住。 –

0

如果您在球拍中使用可變列表/對,則必須記住,它與完全獨立的數據類型不同,它使用()語法。 當你'請求'庫的工作與可變數據通過調用: (請求計劃/ mpair)
您現在必須切換到使用相應的程序從該lib - mcar,mcdr,mpair,mlist,mcons構建對,謂詞等,否則無法從'mcons'接收和錯誤。 http://docs.racket-lang.org/reference/mpairs.html

相關問題