loops - 带计数器的递归过程?
问题描述
我应该编写一个递归算法来返回谓词“ pred
”为真的区间中的整数数。
我设法编写了从下限移动到上限的递归部分,但我不知道如何实现某种计数器,每次谓词对整数为真时,计数器递增 1,因为我的代码是递归的(即我一直调用相同的方法)。如果我在方法内创建计数器,每次调用它时,计数器都会被初始化为 0。
到目前为止我写的:
(define count-true
(lambda (pred lower upper)
(if (or (> lower upper) (= lower upper))
(pred lower)
(count-true pred (+ lower 1) upper))))
原来的问题:
编写一个
(count-true pred lower upper)
类型为 的递归(非迭代)过程 ,它返回应用于该数字的谓词为真的范围(包括)(number->boolean),number,number->number
内的整数个数。lower..upper
pred
解决方案
在函数式编程中,您不设置局部变量/计数器。您使用参数或返回值来传递(和命名)数据。在这种情况下,您可以使用返回值(如果您不想更改函数参数的数量来添加计数器)。
因此,每次 when pred
is时true
,您都会返回从递增的递归调用中收到的1
内容,或者按原样返回您收到的内容。
(define count-true
(lambda (pred? lower upper)
(if (or (> lower upper) (= lower upper))
0
(if (pred? lower)
(+ 1 (count-true pred? (+ lower 1) upper))
(count-true pred? (+ lower 1) upper)))))
评论:我改成pred
是pred?
因为它是谓词,所以它使代码更具可读性。您还可以简化此代码以count-true
首先调用,然后使用if
来决定如何处理返回值。并且 first if
withor
子句也可以使用>=
. 如果您想学习使用列表、数字等进行递归,“Little Schemer”是一本很棒的书。
推荐阅读
- typescript - TSLint 抱怨“不推荐使用 Express bodyParser”
- spring-boot - 在对具有多个依赖项的组件类进行单元测试时,如何处理基于 Spring Boot 构造函数的依赖注入混淆/沮丧
- reactjs - 如何将 .map() 中的值应用于 Firebase 中的另一个集合
- java - 在 Java 和 SQL SERVER 中存储时间
- javascript - 平面列表导航到另一个屏幕
- python - 获取 IndexError:python 问题的字符串索引超出范围
- python - 无法为 Dask 安装 tlz 模块 Python
- regex - 正则表达式在括号中查找带有条件的文本
- postgresql - Spring bootRun在安装平台时失败
- function - 测试条件输入是否是c ++中的字符