SICP 1.1
1.1は基本的な部分。
- 問題 1.1 評価するだけなので略
- 問題 1.2 略
- 問題 1.3
(define sum-of-max-2-square (lambda (x y z) (cond ((and (< x y)(< x z)) (sum-of-square y z)) ((and (< y x)(< y z)) (sum-of-square x z)) ((and (< z x)(< z y)) (sum-of-square x y)))))
- 問題 1.4
(define (a-plus-abs-b a b) ((if (> b 0) + -) a b))
は、bが正の数のときは a + b を、負の数のときは a - b を実行する
- 問題 1.5
まず、
(define (p) (p))
は自身をよびつづける無限ループの関数。
(define (test x y) (if (= 0 x) 0 y)) (test 0 (p))
正規順序では関数を展開してから評価、作用的順序の場合は引数を評価してから関数の評価をするので、
正規順序→(p)は評価されず、0が返る
作用的順序→(test 0 (p))のときに(p)が評価されてしまい無限ループに
- 問題 1.6
condであらたに定義しなおしたnew-ifは特殊形式でなくただの関数なので、述語部が真のときにもelse節は評価されてしまう。よって無限ループに。
- 問題 1.7
小さい数、大きい数では、なぜ駄目になるかは正直わからんかったので、http://oss.timedia.co.jp/show/SICP/ex-1.7ここを見ました。なるほど。
改良のプログラムはgood-enoughを
(define (good-enough? guess x) (< (abs (- 1.0 (/ guess (improve guess x)))) 0.001))
とする。
- 問題 1.8
improveを変えればOKなはず。
(define (improve-cuberoot guess x) (/ (+ (/ x (square guess))(* 2 guess)) 3)) (define (cuberoot-iter guess x) (if (good-enough? guess x) guess (cuberoot-iter (improve-cuberoot guess x) x)))