带计数器的递归过程?
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 值(如果您不想更改函数参数的数量以添加计数器)。
因此,每次 pred
为 true
时,您 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 值。而第一个if
和or
子句也可以简化为>=
。 "Little Schemer" 如果您想学习列表、数字等的递归,这是一本好书
我应该编写一个递归算法来计算 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 rangelower..upper
(inclusive) for which predicatepred
applied to that number is true.
在函数式编程中,您不设置本地 variable/counter。您使用参数或 return 值来传递(和命名)数据。在这种情况下,您可以使用 return 值(如果您不想更改函数参数的数量以添加计数器)。
因此,每次 pred
为 true
时,您 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 值。而第一个if
和or
子句也可以简化为>=
。 "Little Schemer" 如果您想学习列表、数字等的递归,这是一本好书