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)))