2

f が数値関数で、n が正の整数の場合、f の n 回目の反復適用を形成できます。これは、x における値が f(f(...(f(x))) である関数として定義されます。 ..)))。たとえば、f が関数 x + 1 の場合、f を n 回繰り返し適用すると、関数 x + n になります。f が数値の 2 乗演算である場合、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 で ID が事前定義されているかどうかはわかりません。そうでない場合は、簡単に記述できます。)

現在、これは直接再現できません。これは、任意のもので繰り返される呼び出しの外側で魔法のようにコードを囲むことができないためです。しかし、compose を使用して書き直すと、これらの削減手順はどのように見えるでしょうか? 得られたステップのリストからパターンを見つけて、それを再現できますか?

于 2008-10-30T08:24:48.837 に答える