3
(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 次重复应用的过程。

4

3 回答 3

1

我假设 (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)))
于 2008-11-10T02:59:42.620 回答
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”,并且 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)

我希望这不是作业问题。

于 2008-11-10T03:03:01.337 回答
0

出于好奇,您的功能什么?是跑步fn?如果是这样,您可以这样做。

(define (repeated f n)
  (for-each (lambda (i) (f)) (iota n)))
于 2008-11-10T02:07:03.430 回答