(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 次重复应用的过程。
我假设 (repeated 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)))
(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”,并且 lambda 表达式清楚地表明您期望您的参数分两个阶段。(注意:recur 不像 Clojure 那样内置在 Scheme 中,我只是喜欢这个名字)
> (define foonly (repeat sub1 10))
> (foonly 11)
1
> (foonly 9)
-1
您在这里想要的很酷的功能特性是柯里化,而不是组合。这是带有隐式柯里化的 Haskell:
repeated _ 0 x = x
repeated f n x = repeated f (pred n) (f x)
我希望这不是作业问题。
出于好奇,您的功能是什么?是跑步f
吗n
?如果是这样,您可以这样做。
(define (repeated f n)
(for-each (lambda (i) (f)) (iota n)))