SICP: 2009年12月アーカイブ



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



参考文献



あわせて読みたい

  • あわせて読みたいブログパーツ

Lingr java-ja

ウェブページ

2009年12月: 月別アーカイブ

Powered by Movable Type 4.1