带计数器的递归过程?

Recursive procedure with a counter?

我应该编写一个递归算法来计算 return 区间内的整数个数,其中谓词“pred”为真。

我设法编写了从下限移动到上限的递归部分,但我不知道如何实现某种递增的 counter每次谓词对整数为真时减 1,因为我的代码是递归的(即我一直调用相同的方法)。如果我在方法中创建计数器,每次调用时,计数器都会被初始化为 0。

到目前为止我写了什么:

(define count-true
  (lambda (pred lower upper)
    (if (or (> lower upper) (= lower upper))
        (pred lower)
        (count-true pred (+ lower 1) upper))))

原题:

Write a recursive (not iterative) procedure, (count-true pred lower upper), of type (number->boolean),number,number->number, that returns the number of integers in the range lower..upper (inclusive) for which predicate pred applied to that number is true.

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

因此,每次 predtrue 时,您 return 从递归调用中收到的内容增加 1,或者 return 您收到的内容否则就是这样。

(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 来决定如何处理 return 值。而第一个ifor子句也可以简化为>="Little Schemer" 如果您想学习列表、数字等的递归,这是一本好书