我正在使用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