0

我在递归方面遇到了麻烦。我这里的程序很简单。它消耗一个捐赠列表,如果列表中的任何捐赠超过 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)) 

它会给我 False,它不应该,因为其余的超过 2500。所以它应该给我真实的。

我在程序的递归部分做错了什么?

4

1 回答 1

2

程序中的每个条件都存在问题any-bad-donations?

  1. 如果列表是空的,那么因为没有“不良捐赠”,false应该被退回
  2. 您不必检查列表是否是一对 using cons?,您需要做的是检查当前元素是否是不良捐赠,如果是这种情况,那么您可以true立即返回,我们已经找到了
  3. 你错误地推进了递归

这应该可以解决问题,但要小心 - 您考虑递归解决方案的方式似乎存在概念问题:

(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)))
=> #t
于 2013-10-17T03:39:27.520 回答