2

如果f是一个数值函数,n是一个正整数,那么我们可以形成f的第n次重复应用,它被定义为在x处的值为f(f(...(f(x)))的函数。 ..))。例如,如果 f 是函数 x + 1,则 f 的第 n 次重复应用是函数 x + n。如果 f 是一个数的平方运算,则 f 的第 n 次重复应用是将其参数提高到 2^n 次方的函数。编写一个过程,将计算 f 和正整数 n 的过程作为输入,并返回计算 f 的第 n 次重复应用的过程。您的程序应该能够按如下方式使用:

((repeated square 2) 5)
625

您可以使用它来简化答案:

 (define (compose f g) (lambda (x) (f (g x))))
4

2 回答 2

2
(define (repeated f n)
  (if (= n 1)
      f
      (compose f (repeated f (- n 1)))))
于 2009-05-05T10:59:00.807 回答
1

您是否刚刚删除并重新提出了这个问题?我在这里复制我以前的答案(谢天谢地,我的浏览器已经缓存了它):

好吧,你可能想要这样的东西,对吧?

((repeated square 3) 5)
-> (square ((repeated square 2) 5))
-> (square (square ((repeated square 1) 5)))
-> (square (square (square ((repeated square 0) 5))))
-> (square (square (square (identity 5))))

(不知道Scheme中是否预定义了identity,如果没有,写起来很容易。)

现在,这不是直接可重现的,因为您无法将代码神奇地包含在对任意内容重复的调用之外。但是,当使用 compose 重写时,这些缩减步骤是什么样的?你能在生成的步骤列表中找出一个模式并重现它吗?

于 2008-10-30T08:24:48.837 回答