問題1-41〜46

今日は、第一章の最後に掲載されている問題について、その取り組んだ結果をまとめてみようと思います。最後の二問については、あまりしっかりと取り組むことができなかったので、明日の勉強会でリカバリーしようと考えています。
まずは、問題1-41です。引数として受け取った手続きを二回連続で作用させるような手続きを返す手続き「double」です。doubleにdoubleを渡していくと、作用回数が指数的に増加していく様子を観察することができました。

(define (double proc)
  (lambda (x) (proc (proc x))))

(define (inc x) (+ 1 x))

((double inc) 5)

(((double double) inc) 5)

(((double (double double)) inc) 5)

(((double (double (double double))) inc) 5)

=>7
=>9
=>21
=>261

次の問題1-42は、合成関数に関する問題です。

(define (compose outer inner)
  (lambda (x) (outer (inner x))))

(define (inc x) (+ 1 x))
(define (square x) (* x x))

((compose square inc) 6)

=>49

このcompose手続きを使って、任意の回数だけ同じ手続きを作用させ続ける手続きを書くのが問題1-43です。

(define (repeated proc times)
  (define (iter n)
    (if (< n 1)
        (lambda (x) (proc x))
        (lambda (x) (proc ((iter (- n 1)) x)))))
  (iter (- times 1)))

((repeated square 2) 5)

=>625

最後は問題1-44です。

(define dx 0.00001)

(define (smooth f)
  (lambda (x) (/ (+ (f (- x dx))
                    (f x)
                    (f (+ x dx)))
                 3)))

((smooth square) 4)

(define (n-fold-smooth f times)
  ((repeated smooth times) f))

((n-fold-smooth square 4) 4)

=>16.000000000066663
=>16.000000000266663

今回のエントリーを通じて、自分が導きだした答えだけを書き綴っても、あまり意味がないことに気づきました。それよりも、そこに至ったプロセスの方が大事で、悩んだ点やひらめいた点などを書いていった方が、あとで読み返したときに感じるであろう面白さが増すのではないかと思っています。第二章からは、そんなことも意識しながら勉強過程を記していけたらいいなと考えています。