首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于列表中的递归

关于列表中的递归
EN

Stack Overflow用户
提问于 2013-10-17 03:18:47
回答 1查看 57关注 0票数 0

我在递归方面有困难。我的程序很简单。它使用一份捐赠清单,如果名单上的任何捐赠超过2500,则返回真实。

代码语言:javascript
复制
(define-struct donation (donor amount))

这是我的帮手

代码语言:javascript
复制
;;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)))]))

如果我做了这样的事情,效果会很好

代码语言:javascript
复制
(any-bad-donations? (list (make-donation "Marry" 50000))

会产生真实,因为它超过了2500。

但如果我做了

代码语言:javascript
复制
(any-bad-donations? (list (make-donation "Marry" 50) (make-donation "Marry 50000)) 

它会给我假的,这是不应该的,因为其余的都超过2500。所以它应该给我真实的答案。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-17 03:39:27

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

  1. 如果列表是空的,那么由于没有“不良捐赠”,应该返回false
  2. 您不需要检查列表是否是使用cons?的一对,您需要做的是检查当前元素是否是错误的捐赠,如果是这样的话,您可以立即返回true,我们已经找到一个
  3. 你不正确地推进了递归

这应该可以解决问题,但是要小心--在您对递归解决方案的思考方式中,似乎存在一个概念性问题:

代码语言:javascript
复制
(define (any-bad-donations? lod)
  (cond
    [(empty? lod) false]
    [(bad-donations (first lod)) true]
    [else (any-bad-donations? (rest lod))]))

现在,该解决方案如预期的那样工作:

代码语言:javascript
复制
(any-bad-donations?
 (list (make-donation "Mary" 50000)))
=> #t

(any-bad-donations?
 (list (make-donation "Mary" 50) (make-donation "Mary" 50000)))
=> #t
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19417655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档