當你到達列表的末尾時會發生什麼?像(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))))
現在,有兩點需要注意:
這可以顯著簡化。使用一些布爾邏輯,你甚至可以完全擺脫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))
的值。
- 更重要的問題是,你說你想檢查
item
是否是列表或任何其子列表的成分,但是,你的代碼現在(待有關檢查空列表修復)只檢查是否item
是list
的成員,而不是其任何子列表。當item
不等於(car list)
時,可能是因爲(car list)
是另一個列表,您需要遞歸併檢查item
是否在其中。你可能會通過查看search through nested list in scheme to find a number來獲得幫助,但它不會告訴你究竟是該怎麼做。
我輸入(fun3'w(list'a'b))來執行此操作,但它顯示如上所述的錯誤。其他明智的,如果它發現的元素,那麼沒有錯誤。 –
另請參閱http://stackoverflow.com/q/664288/1281433。 –