我遇到递归问题。我的程序很简单。如果列表中的任何捐款超过2500,它会消耗捐赠清单并返回true。
(define-struct donation (donor amount))
这是我的帮手
;;helper
(define (bad-donations bad-d)
(cond
[(number? bad-d) (<= 50 bad-d)]
[(donation? bad-d) (< 2500 (donation-amount bad-d))]))
(check-expect (bad-donations 51) true)
(check-expect (bad-donations 30) false )
(check-expect (bad-donations 50) true)
(define (any-bad-donations? lod)
(cond
[(empty? lod) true]
[(cons? lod)
(bad-donations (first lod))]
[else
(any-bad-donations? (bad-donations (rest lod)))]))
如果我执行类似
的操作,它可以正常工作(any-bad-donations? (list (make-donation "Marry" 50000))
应该产生True,因为它超过2500的限制。
但如果我这样做
(any-bad-donations? (list (make-donation "Marry" 50) (make-donation "Marry 50000))
它会给我错误,它不应该,因为其余的超过2500.所以它应该给我真实。
我的程序的递归部分出错了什么?
答案 0 :(得分:2)
any-bad-donations?
程序中的每个条件都存在问题:
false
cons?
的一对,你需要做的是检查当前元素是否是一个不好的捐赠,如果是这种情况,那么你可以返回{{ 1}}马上,我们找到了一个这应该解决问题,但要小心 - 你在考虑递归解决方案时似乎存在一个概念上的问题:
true
现在解决方案按预期工作:
(define (any-bad-donations? lod)
(cond
[(empty? lod) false]
[(bad-donations (first lod)) true]
[else (any-bad-donations? (rest lod))]))