我正在使用 DrRacket R5RS 学习方案。我以为我已经确定了这些概念,但我无法让这个简单的递归练习起作用。我认为这是 DrRacket 中的一个错误,但我不确定。
有人能看到问题,并希望能解释为什么我的代码不起作用吗?我真的很想学习这种函数式语言。
此代码将正确生成 #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
)))
当我使用 (three '(1 2 3 6) 0 0 0 0) 启动程序时,它返回 #T,因为 1+2+3=6。当我使用 (three '(1 2 3 5) 0 0 0 0) 启动程序时,它返回 #F,因为 1+2+3!=5。
现在,问题来了。我想做多分支递归。但是,此代码每次都返回 #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!
)))
有任何想法吗?