ウォンツテック

そでやまのーと

SICP勉強 1

SICP(計算機プログラムの構造と解釈)本をついつい買ってしまったのでちょっとずつ読もうと思う。
ルール
・基本、問題を全部解く
・分からなかったらwebで答えを探して写経する
・あんまり気合を入れてやらない(はまると他の勉強が出来なくなる)

問題1.3

(define (square a b)
        (+ (* a a) (* b b)))
(define (big a b)
        (if (< a b) b a))
(define (small a b)
        (if (< a b) a b))
(define (func a b c)
        (square (big a b) (big (small a b) c)))

あってるけどこんな書き方でいいのやら。。


問題1.6

問題1.5と同様の現象っぽいので問題を単純化して考えてみた
・ifを使う場合

(define (check x y)
  (if (> x y)
       x
       (check (improve x)
              y)))
(define (improve x y) (+ x 1))

これはx,yの値をチェックしxが大きければxを返し、yの方が
大きければxに1を加えて同じ処理を再帰的に行う。
この場合はifの評価式「(> x y)」が行われてからその結果
としてthen-clauseの「x」かelse-clauseの「(check (improve x) y)」が評価される。
※特殊形式のifは先にpredicate((> x y)の部分)を評価する

・new-ifを使う場合

(define (check x y)
  (new-if (> x y)
           x
          (check (improve x)
                 y)))
(define improve x y) (+ x 1))
(define (new-if predicate then-clause else-clause)
         (cond (predicate then-clause)
               (else else-clause)))

new-ifの場合評価、完全に展開する正規順序の評価なので
(> x y)の評価の如何にかかわらず(check (improve x) y)
が永遠と展開される


問題1.7

good-enough?部分を以下のように変更

(define (good-enough? guess x) 
  (< (/ (abs (- guess  (improve guess x)))  
         guess) 0.001)) 

問題1.8

(define (cbrt-iter guess x) 
  (if (good-enough? guess x) 
      guess  
      (cbrt-iter (improve guess x) 
                 x))) 
(define (improve guess x) 
  (/ (+ (/ x (squre guess)) (* guess 2)) 3)) 
(define (good-enough? guess x) 
  (< (/ (abs (- guess (improve guess x))) 
        guess) 
     0.001)) 
(define (abs x) 
  (if (> x 0) x (- x))) 
(define (squre x) (* x x)) 
(define (cbrt x) 
  (cbrt-iter 1.0 x))