javascript で関数プログラミング
カエルチュウイホウ - elispで高階関数
とか思ったのでperlでも書いてみた。
my $inc = sub {$_[0] + 1};
my $cube = sub {$_[0] ** 3};

sub sum {
my ($term,$a,$next,$b) = @_;
return 0 if $a > $b;
$term->($a) + sum($term,$next->($a),$next,$b);
}

print sum($cube,1,$inc,80);

 ということで、javascript でも書いてみた。
var inc = function(n){ return n + 1 };
var cube = function(n){ return n * n * n };

function sum (term, a, next, b) {
if (a > b) {
return 0;
}
else{
return term(a) + sum(term, next(a), next, b);
}
}

console.log(sum(cube, 1, inc, 10)); //=> 3025

 うーん、、、なんかそのまんまでひねりが無い(特に何も考えなくても出来てしまう javascript が面白いという話もあるけど)。

 ということで、高階関数に渡す関数をクロージャにしてみる。TermMaker と IncMaker がクロージャを作る関数。
var TermMaker = function (time) {
return function (n) {
return Math.pow(n, time);
}
}

var IncMaker = function (plus) {
return function (n) { return n + plus };
}

function sum (term, a, next, b) {
if (a > b) {
return 0;
}
else{
return term(a) + sum(term, next(a), next, b);
}
}

var inc = IncMaker(1);
var cube = TermMaker(3);
console.log(sum(cube, 1, inc, 10)); //=> 3025;

var inc2 = IncMaker(2);
var sq = TermMaker(2);
console.log(sum(sq, 1, inc2, 50)); //=> 20825

 ま、そんな感じで。


4/28 追記
TermMaker を
var TermMaker = function (time) {
return function (n) {
var ret = n;
for (var i = 0; i < time - 1; i++) {
ret *= n;
}
return ret;
}
}
から
var TermMaker = function (time) {
return function (n) {
return Math.pow(n, time);
}
}
に書き換えた。
[PR]
by fkmn | 2007-04-27 23:28 | IT
<< 【感想】逆転裁判4 常識を越えるサービスは、常識に... >>


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX