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