我正在使用DrRacket R5RS學習Scheme。我認爲我已經掌握了這些概念,但是我無法得到這個簡單的遞歸練習。我認爲這是DrRacket中的一個錯誤,但我不確定。Scheme(DrRacket) - cond語句不適用於遞歸
有人可以看到問題,並希望解釋爲什麼我的代碼不起作用?我真的很想學習這個功能語言。
此代碼將產生#T和#F正確:
(define three (lambda (L target1 target2 target3 sum)
(cond
((= target1 0) (three L (car L) (cadr L) (caddr L) 0))
((NULL? L) (= (- sum (+ target1 (+ target2 target3))) (+ target1 (+ target2 target3)))) ; sum minus targets = targets
(else (three (cdr L) target1 target2 target3 (+ sum (car L)))) ; return true if branch returns true
)))
當我啓動該程序(3「(1 2 3 6)0 0 0 0),則返回#T因爲1+ 2 + 3 = 6。當我用(3'(1 2 3 5)0 0 0 0)啓動程序時,從1 + 2 + 3!= 5開始返回#F。
現在,這是問題所在。我想做多分支遞歸。但是,此代碼每次都會返回#T!因爲我不能讓它返回#F,我不能讓它跳到遞歸的下一個分支。
(define three (lambda (L target1 target2 target3 sum)
(cond
((= target1 0) (three L (car L) (cadr L) (caddr L) 0))
((NULL? L) (= (- sum (+ target1 (+ target2 target3))) (+ target1 (+ target2 target3)))) ; sum minus targets = targets
((three (cdr L) target1 target2 target3 (+ sum (car L))) #T) ; return true if branch returns true
(else 'hit_the_bottom) ; IT NEVER HITS THIS STATEMENT!
)))
任何想法?
快速回答:用'(else #f)'替換最後一行,它就會起作用。要看到_why_,請看下面的答案。 – 2013-04-22 02:02:58