(define (repeated f n)
if (= n 0)
f
((compose repeated f) (lambda (x) (- n 1))))
我写了这个函数,但是如何使用重复的简单递归更清楚地表达这个?
对不起,我忘了定义我的撰写功能。
(define (compose f g) (lambda (x) (f (g x))))
该函数将计算f和正整数n的过程作为输入,并返回计算f的第n次重复应用的过程。
答案 0 :(得分:1)
我假设(重复f 3)应该返回一个函数g(x)= f(f(f(x)))。如果那不是你想要的,请澄清。无论如何,重复的定义可以写成如下:
(define (repeated f n)
(lambda (x)
(if (= n 0)
x
((repeated f (- n 1)) (f x)))))
(define (square x)
(* x x))
(define y (repeated square 3))
(y 2) ; returns 256, which is (square (square (square 2)))
答案 1 :(得分:1)
(define (repeated f n)
(lambda (x)
(let recur ((x x) (n n))
(if (= n 0)
args
(recur (f x) (sub1 n))))))
按照通常的方式编写函数,除了参数分两个阶段传递。用这种方式定义repeated
可能更清楚:
(define repeated (lambda (f n) (lambda (x)
(define (recur x n)
(if (= n 0)
x
(recur (f x) (sub1 n))))
(recur x n))))
你不必以这种方式使用'let-loop',而lambdas显然你希望你的论证分两个阶段。 (注意:recur不是内置于Scheme中,因为它在Clojure中,我就像这个名字一样)
> (define foonly (repeat sub1 10))
> (foonly 11)
1
> (foonly 9)
-1
你想要的很酷的功能是currying,而不是构图。这是带有隐含currying的Haskell:
repeated _ 0 x = x
repeated f n x = repeated f (pred n) (f x)
我希望这不是一个家庭作业问题。
答案 2 :(得分:0)
是 你的功能试图做什么,只是出于好奇?它要运行f
,n
次吗?如果是这样,你可以这样做。
(define (repeated f n)
(for-each (lambda (i) (f)) (iota n)))