だらだら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


結構飽きやすいのでヤル気が持続するか微妙ですが、とにかくできるところまでやってみる。
少しずつでも前進しなきゃ。