SICPの最近のブログ記事



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



参考文献





java-ja来てた??


問題1.3


問題1.3はJavaScriptとSchemeで考えながら解いた。


帰宅してから解答がおおよそ浮かび、翌日の朝やっと完了。


Gauche


(define (proc1 a b c)
(if (and (<= a b)(<= a c))
(+ (proc2 b)(proc2 c))
(proc1 b c a)))

(define (proc2 x)
(* x x))

(print (proc1 1 2 3))
;=>13
(print (proc1 2 4 3))
;=>25
(print (proc1 5 4 3))
;=>41
(print (proc1 1 1 1))
;=>2

JavaScript



  • defineはvarで宣言した変数に束縛する。function宣言だと書いてみたけどないわー。

  • 原則returnで返す。



var proc1 = function(a,b,c){
if(a <= b && a <= c){
return proc2(b) + proc2(c);
}
return proc1(b,c,a);
};
var proc2 = function(x){
return x * x;
};

alert(proc1(1,2,3));
//=>13
alert(proc1(2,4,3));
//=>25
alert(proc1(5,4,3));
//=>41
alert(proc1(1,1,1));
//=>2



参加経緯


以前挫折したSICPを読むべくsicp-liteに参加した。


プログラミングGaucheを読む事2周目に突入しSchemeになれたから。



内容


sicp-liteの内容は、指定単元を読んできたこと前提で本書に掲載されている問題を解く。


詰まったところは発表したり話あったり。実際にソースコードをスクリーンに映したり。ホワイトボードつかったり。



正直な話。私は解答出来なかった。わからん>_<



理由は、



  • 数学的知識の欠如。

  • 魔術師本自体の日本語訳が理解できなかった。

  • 予習が不足していた。


予習不足については、改善の余地あり。他の二つ。


特に数学的知識については一朝一夕ではいかない。


...合成関数、不動点、Newton法、区間二分法...わからん>_<



本書問題


一番緩い問題ですら理解しきれてない。


問題1.41(p.43)


問題1.41


引数として一引数の手続きをとり,受け取った手続きを二回作用させる手続きを返す手続きdoubleを定義せよ.例えばincが引数に1を足す手続きとすれば,(double inc)は2を足す手続きとなる.




(define (inc arg)
(+ arg 1))

(define (double f)
(lambda (x) (f ( x))))

(((double (double double)) inc) 5)

gosh> 21

なぜ、21?どう展開されてるの...?


JavaScriptで何気なく書いてるような気がしないでもないけど...ここまでな書き方はしない。



参加者


コアメンバはSICP読み込んでいる方みたい。SICPの全貌を理解されているよう。


現役学生も参加しており、とても意欲的な明るいメンバ。


私見


sicp-liteコミュニティ(コミュニティでよい?)について

sicp-liteコミュニティ(?)方針として過去のsicp-liteを軌跡残しで議事録を取っていることは初参加者や既存参加者にやさしい!


あとメンバが良い人!←これ重要。



次回も参加しよう。



SICP自体について

id:nowokayこと、きしださんが書いていたいまSICPを読むのは時間の無駄が脳裏に浮かんだ。



というのは、数学知識に不足している私にはいくらやっても意味ないみたい...?


根本的な欠如。だがもう少し進める。



追記


java-jaのもっと素人臭いSICP読書会 in Java-jaは投票数がダントツだがいつやるのだろうか...?



参考


あわせて読みたい

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

Lingr java-ja

ウェブページ

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

Powered by Movable Type 4.1