我在递归方面有困难。我的程序很简单。它使用一份捐赠清单,如果名单上的任何捐赠超过2500,则返回真实。
(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))会产生真实,因为它超过了2500。
但如果我做了
(any-bad-donations? (list (make-donation "Marry" 50) (make-donation "Marry 50000)) 它会给我假的,这是不应该的,因为其余的都超过2500。所以它应该给我真实的答案。
我的程序的递归部分做错了什么?
发布于 2013-10-17 03:39:27
any-bad-donations?过程中的每个条件都存在问题:
false。cons?的一对,您需要做的是检查当前元素是否是错误的捐赠,如果是这样的话,您可以立即返回true,我们已经找到一个这应该可以解决问题,但是要小心--在您对递归解决方案的思考方式中,似乎存在一个概念性问题:
(define (any-bad-donations? lod)
(cond
[(empty? lod) false]
[(bad-donations (first lod)) true]
[else (any-bad-donations? (rest lod))]))现在,该解决方案如预期的那样工作:
(any-bad-donations?
(list (make-donation "Mary" 50000)))
=> #t
(any-bad-donations?
(list (make-donation "Mary" 50) (make-donation "Mary" 50000)))
=> #thttps://stackoverflow.com/questions/19417655
复制相似问题