だらだらSICP1
『計算機プログラムの構造と解釈 第二版』(以下、SICP)を読んでみる。
マイペースに学習しようと思うので、途中で挫折する可能性もなきにしもあらずだけれど。
SICPは問題量が結構多いので、大体10問前後解けたら書き込むことにしてみる。
関数の定義の仕方は本とは微妙に異なっていますが、動作は同じはずです。
The Little Schemerと平行して読んでいるので、こちらの定義の仕方に統一しようと思います。てかそっちメインだったり・・・。
以下に書くのは、コードを書く問題のみにします(実際には他の問題も解いてます、きっと)。
1.3
(define sum-of-squares (lambda (x y) (+ (* x x) (* y y)))) (define ret-big2 (lambda (a b c) (cdr (sort (list a b c))))) (define f1-3 (lambda (x y z) (sum-of-squares (car (ret-big2 x y z)) (cadr (ret-big2 x y z)))))
関数名思いつかなかったので、問題番号にしました。
3つの引数のうち、大きい方から2つ選んでリストにして返す関数、ret-big2を定義してみました。
1.7
(define good-enough? (lambda (guess x) (< (abs (- guess (improve guess x))) 1.0e-20)))
average,improveは本の通りです。good-enough?を書き換えました。
これを用いて(sqrt 2)を計算すると、
gosh> (sqrt 2) 1.414213562373095
となりました。
1.8
(define improve-sqrt3 (lambda (guess x) (/ (+ (/ x (* guess guess)) (* 2 guess)) 3))) (define sqrt3-iter (lambda (guess x) (cond ((< (abs (- guess (improve-sqrt3 guess x))) 1.0e-20) guess) (else (sqrt3-iter (improve-sqrt3 guess x) x))))) (define sqrt3 (lambda (x) (sqrt3-iter 1.0 x)))
sqrtのやり方そのままで立方根(sqrt3)も定義してみました。
gosh> (sqrt3 2) 1.2599210498948732
結構飽きやすいのでヤル気が持続するか微妙ですが、とにかくできるところまでやってみる。
少しずつでも前進しなきゃ。