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シェル
参考文献
- 作者: ジェラルド・ジェイサスマン, ジュリーサスマン, ハロルドエイブルソン, Gerald Jay Sussman, Julie Sussman, Harold Abelson, 和田英一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2000/02
- メディア: 単行本
- 購入: 23人 クリック: 318回
- Amazon.co.jpで詳細を見る