racket - 如何不在 min-30-percent 函数中递归调用辅助函数?
问题描述
(define (sum lst finalans)
(cond
[(empty? lst) finalans]
[else (+ finalans (first lst) (sum (rest lst) finalans))]))
(define (min-thirty-percent lst)
(cond
[(empty? lst) empty]
[(> (first lst) (* 0.3 (sum lst 0))) (cons (first lst) (min-thirty-percent (rest lst)))]
[else (min-thirty-percent (rest lst))]))
我已经编写了这个程序,我不想递归地计算总和。总和值随着列表的变化而变化,但我不希望这样。我希望计算一次列表的总和,然后进行比较。我怎样才能做到这一点?
解决方案
首先,我想指出,在您的示例中,finalans
始终为 0。看起来您正在尝试在那里使用累加器,但您只是直接调用它。我建议你完全删除它给你:
(define (sum lst)
(cond
[(empty? lst) 0]
[else (+ (first lst) (sum (rest lst)))]))
或者,您可以通过使用sum
提供的来简化它math/base
现在,您可能想要的是一个额外的伪辅助函数min-thirty-percent
,它允许您计算总和一次,然后从那里进行递归调用。事实证明,Racket 的命名let
语法对此非常方便:
(define (min-thirty-percent lst)
(let loop ([lst lst]
[min30 (* 0.3 (sum lst))])
(cond
[(empty? lst) empty]
[(> (first lst) min30) (cons (first lst) (loop (rest lst) min30))]
[else (loop (rest lst) min30)]))
虽然,因为这是一个如此简单的操作,你也可以直接使用球拍的for/list
构造,完全跳过递归:
(define (min-thirty-percent lst)
(define min30 (sum lst)
(for/list ([i lst]
#:when (i . > . min30))
i))
推荐阅读
- html - 如何使文本块固定而不与其他元素重叠?
- hive - How to retrieve only the latest version of the records from multiple ORC files (via a Hive table) which contain multiple versions for each record?
- sql - 为了避免空白,我应该使用什么来代替顺序?
- php - 有没有办法用 PHPPresentation 下载 pptx 文件?
- eclipse - 如何根据测试用例的状态(通过失败)设置计数器
- reactjs - 如何使用 istanbul 检测代码构建和转译 React 应用程序
- php - 模拟 Laravel 命令依赖
- html - Excel 的 ColorIndex VBA 转换为 HTML 颜色
- php - Yii2 : 创建自定义全局事件
- python - 测试将值插入 mongodb (pyspark, pymongo)