SICP 問題1.43

2017-09-04

fを数値関数, nを正の整数とすると, xでの値がf(f(… (f(x)) … ))であるfのn回作用関数が定義出来る.
例えばfを関数x→x + 1とすると, fのn回作用は関数x→x + nである.
fが数を二乗する演算なら, fのn回作用は引数を2n乗する関数である.
入力としてfを計算する手続きと, 正の整数nをとり, fのn回作用を計算する手続きを書け. その手続きは:

((repeated square 2) 5)
625

のように使えなければならない.
ヒント:問題1.42のcomposeを使うと便利である.

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

(define (repeated f n)
  (define (iter cnt result)
    (if (= cnt n)
        (lambda (x) (result x))
        (iter (+ cnt 1) (compose f result))))
  (iter 0 (lambda (fn) fn)))

((repeated square 2) 5)
; 625

合ってるかな・・・。