特殊形式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 件のコメント:
コメントを投稿