2008/12/28

【scheme】1.1.7 例:Newton法による平方根@SICP

1.1.7 例:Newton法による平方根@SICPがよくわからなかったのでとりあえず写経してみた。 とりあえず、今回みたいな数学的なことはあまり真剣に読み解こうとはせず進めていこう。

全景

(define avarage
  (lambda (x y)
    (/ (+ x y) 2)))

(define square
  (lambda (x)
    (* x x)))

(define improve
  (lambda (guess x)
    (avarage guess (/ x guess))))

(define good-enough?
  (lambda (guess x)
    (< (abs (- (square guess) x)) 0.001)))

(define sqrt-iter 
  (lambda (guess x)
    (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x) x))))

(define sqrt
  (lambda (x)
    (sqrt-iter 1.0 x)))

(sqrt 9);;=> 3.00009155413138
(sqrt (+ 100 37));;=> 11.704699917758145
(sqrt (+ (sqrt 2)(sqrt 3)));;=> 1.7739279023207892
(square (sqrt 1000));;=> 1000.000369924366

最初の手続。これは名前通りパラメータの平均を返す。

(define avarage
  (lambda (x y)
    (/ (+ x y) 2)))

(avarage 10 20);;=> 15
(avarage 5.0 8.0);;=> 6.5

これも名前の通りパラメータの2乗を返す。

(define square
  (lambda (x) 
    (* x x)))
(square 5);;=> 25
(square 12);;=> 144

これは???「improve」を辞書で調べてもイミフ。改良? http://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=Improv&dtype=1&dname=1na&stype=0&pagenum=1&index=03652100

(define improve
  (lambda (guess x)
    (avarage guess (/ x guess))))

(improve 10.0 5.0);;=> 5.25
(improve 1.5 2.5);;=> 1.5833333333333335

これもなんだろうか。精度の基準だろうとは思う。再帰の終了条件。

(define good-enough?
  (lambda (guess x)
    (< (abs (- (square guess) x)) 0.001)))

処理の本体。再帰してる。

(define sqrt-iter (lambda (guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))))

ラッパー的な、Facade的な、エントランス的な。

(define sqrt
  (lambda (x)
    (sqrt-iter 1.0 x)))

0 件のコメント:

コメントを投稿