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は後で解こう。脳がパンクする。