关于列表中的递归

时间:2013-10-17 03:18:48

标签: list recursion scheme racket

我遇到递归问题。我的程序很简单。如果列表中的任何捐款超过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.所以它应该给我真实。

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

1 个答案:

答案 0 :(得分:2)

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

  1. 如果列表为空,那么因为没有“不良捐款”,应该返回false
  2. 你不必检查列表是否是使用cons?的一对,你需要做的是检查当前元素是否是一个不好的捐赠,如果是这种情况,那么你可以返回{{ 1}}马上,我们找到了一个
  3. 你错误推进了递归
  4. 这应该解决问题,但要小心 - 你在考虑递归解决方案时似乎存在一个概念上的问题:

    true

    现在解决方案按预期工作:

    (define (any-bad-donations? lod)
      (cond
        [(empty? lod) false]
        [(bad-donations (first lod)) true]
        [else (any-bad-donations? (rest lod))]))