JavaScriptで「Newton法による平方根」を求めてみる。

SICPのP.12~ 1.1.7例:Newton法による平方根JavaScriptで求めてみた。


見慣れた言語に書き直すと理解度が高まるから書き直して損はない。

JavaScriptで1.1.7例:Newton法による平方根を求める。

//schemeではif文だが、JavaScriptでは三項演算子を
var sqrt_iter = function(guess, x){
  return (good_enough(guess, x)) ? guess : sqrt_iter(improve(guess, x), x);
};

var improve = function(guess, x){
  return average(guess, x / guess);
};

var average = function(x, y){
  return (x + y) / 2;
};

//JavaScriptでは戻り値をBoolean型として明示化
var good_enough = function(guess, x){
  return (abs((square(guess)) - x) < 0.001) ? true : false;
};

var square = function(x){
  return x * x;
};

var sqrt = function(x){
  return sqrt_iter(1.0, x);
};

//絶対値を求めるabsプロシージャはMathオブジェクトのabsメソッドを利用
var abs = function(x){
  return Math.abs(x);
};

//実行例
alert(sqrt(9)); //3.00009155413138
alert(sqrt(100 + 37)); //11.704699917758145

JavaScriptだと変数名、関数名に「?」と「-」が使えないので、

sqrt-iterはsqrt_iter
good-enough?はgood-enoughに名称を変更。

P.14 問題1.7

SICPのP.14 問題1.7でgood-enoughを改良するのだけど、割愛。

Schemeで1.1.7例:Newton法による平方根

元のSchemeコード。

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

(define (improve guess x)
  (average guess (/ x guess)))

(define (average x y)
  (/ (+ x y) 2))

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

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

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

;;実行例
(display (sqrt 9)) ;;3.00009155413138
(display (sqrt (+ 100 37)) ;;11.704699917758145

参考

JavaScriptシェル

テストには、下記Javascriptシェルを利用しました。
構文のチェックをしてくれる便利な一品。師匠作。
Javascriptシェル

SICP Lite

SICP Liteコミュニティ。およそ隔週ごとに開催。前回は休んじゃった>_<
過去の議事録が揃っているので参考にしました。
SICP Lite