首页 > 解决方案 > 带计数器的递归过程?

问题描述

我应该编写一个递归算法来返回谓词“ 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..upperpred

标签: loopsrecursionschemeracketcounting

解决方案


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

因此,每次 when predis时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)))))

评论:我改成predpred?因为它是谓词,所以它使代码更具可读性。您还可以简化此代码以count-true首先调用,然后使用if来决定如何处理返回值。并且 first ifwithor子句也可以使用>=. 如果您想学习使用列表、数字等进行递归,“Little Schemer”是一本很棒的书。


推荐阅读