SICPを読む(32) 問題1.40 - 1.43 lambda, lambda, lambda。

集中力が高いうちに解こう。

問題1.40

最初、(newtons-method (cubic a b c) 1)とかやって戸惑った。

(define (cubic a b c)
  (lambda (x) (+ (cube x) (* (square x) a) (* x b) c)))

(newtons-method (cubic 0 0 0) 1)

色々試した。

問題1.41

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

な、何っすかコレ。

(define (double f)
  (lambda (x) (f (f x))))
(define (inc x)
  (+ x 1))

展開すると、

((double inc) 1) ; 3
(((double double) inc) 1) ; 5
(((double (double double)) inc) 1) ; 17
(((double (double double)) inc) 5) ; 21

なるほど。

incをlambdaで定義すると、

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

((double (inc)) 1)
(((double (double double)) (inc)) 5) ; 21

こうか。

問題1.42

合成関数。結構便利そう。

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

((compose square inc) 6)

サクッと解けた。楽しい。

問題1.43

僕はこう書いた。

(define (repeated f n)
  (if (= n 1)
      f
      (repeated (compose f f) (- n 1))))

((repeated square 2) 2)

いろんな人のを見ると、こんな解答。

(define (repeated f n)
  (if (= n 1)
      (lambda (x) (f x))
      (repeated (compose f f) (- n 1))))

違いがわからない。うぅぅぅ。

問題1.44

平滑化 ← なんて読むのかわからない(汗

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

((smooth square) 10) ; 99.9998...

n重平滑化

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

((n-fold-smooth square 3) 10) ; 99.9997

最初、(repeated (smooth f) n)と書いてとんでもない値になった。

1.45 - 1.46は後で解こう。脳がパンクする。