Heaven's Kitchen

○ 続JavaScriptで無限リスト

一個前のエントリーの続き。

ひろきのだいちくんの例を見てから,改めて自分の例についてちょっと考えた.

n番目からn+1番目を作る関数が引数としてn番目の値しか受け取れなくて,フィボナッチとか書きたいときに,なんかスマートじゃない。

次の値を計算する関数が,値と一緒にさらに次の値を計算する関数を返せばいい。てか参考にした本

isbn:4774132640

では最初からそうなってた(爆

自然数の場合は現在の値から次の値を作り出すには常に1を足すだけでよいから簡単。

var nat = [1, function (x) { return [x + 1, arguments.callee]; }];

フィボナッチだと次の値を作り出すために,現在の値とひとつ前の値が必要なので少し複雑。

var fib = [0, function (x) { 
	var succ = function (x) {
	    return function(y) {
		return [x+y, succ(y)];
	    };
	};
	return [x+1, succ(x)];
    }];

で,pos, take, mapはこんな感じか。

function next(n) {
    return n[1](n[0]);;
}

function pos(ix, n) {
    for (var i=0;i<ix;i++) {
	n = next(n);
    }
    return n[0];
}

function take(n, inflist) {
    var ary = [];
    for (var i=0;i<n;i++) {
	ary.push(inflist[0]);
	inflist = next(inflist);
    }
    return ary;
}

function map(func, n) {
    var succ = function (n) {
	return function (_) {
            n = next(n);
	    return [func(n[0]), succ(n)];
	};
    };
    return [func(n[0]), succ(n)];
}

実行してみる。

print(take(10, fib)); //0,1,1,2,3,5,8,13,21,34
print(pos(99, fib)); // 218922995834555200000

結局全然JavaScript風じゃないっていう。

元のamachangのエントリーの弾さんのコメントの意味が全然わからないよぅ(汗

<< 前の日記 "JavaScriptで無限リスト"(2008-02-01)

>> 次の日記 "JavaScriptで遅延評価"(2008-02-02)

Valid XHTML 1.0! Valid CSS!