2008年9月16日火曜日

計算機プログラムの構造と解釈 問題1.6


このエントリーをはてなブックマークに追加


特殊形式ifを使わずに、condでnew-ifを定義した場合、
以下のニュートン法の手続きはどうなる?


ニュートン法


xの平方根の予測値yがある場合、yとx/yの平均を採る。
これを繰り返すことで、平方根の値に近づく。
x=2,y=1のとき

x/y = 2/1 = 2
y'=(y+x/y)/2 = (1+2)/2 = 1.5


x/y' = 2/1.5 = 1.3333
y''=(1.5+1.33333)/2 = 1.4167


x/y''=2/1.4167=1.4118
y'''(1.4167+1.4118)/2= 1.4142


new-ifを用いたニュートン法



(define (sqrt-iter guess x)
(new-if (good-enough? guess x);good-enough?の真偽に関わらず偽の場合のsqrt-iterが展開される
guess
(sqrt-iter (improve guess x);ここが無限展開ループ
x)))

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

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



作用的順序では、まず引数をすべて展開するので、good-enough?の真偽に関わらず、
sqrt-iterが展開され続けて無限ループに陥る。





0 件のコメント:

コメントを投稿