带有计数器的递归过程?



我应该编写一个递归算法来返回谓词"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应用于该数字为真。

在函数式编程中,您不设置局部变量/计数器。您可以使用参数或返回值来传递(和命名)数据。在这种情况下,可以使用返回值(如果您不想更改函数参数的数量来添加计数器)。

因此,每次predtrue时,您都会返回从递归调用中收到的递归递增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来决定如何处理返回值。并且带有or子句的第一个if也可以使用>=进行简化。"小阴谋家">是一本很棒的书,如果你想学习列表,数字等递归。

最新更新