Javascriptによるメモ化機能つきY-combinator
唐突に不動点とか高階関数とかそのへんで遊んでみました。引数の個数に制限がないのが嬉しい感じです。
thx to:
function Y_memo(f) {
var memo = {};
function z(x) {
return f(function(){
var argHash = Array.prototype.join.call(arguments, ',');
return memo[argHash] ||
(memo[argHash] = x(x).apply(this, arguments));
})};
return f(z(z));
}
// 使用例1: お約束の階乗
function factorial_gen(f){
return function(n) {
return (n==0) ? 1 : n*f(n-1);
}
}
alert(Y_memo(factorial_gen)(12));
// 使用例2: これまたお約束のフィボナッチ数列
function fibonacci_gen(f){
return function(n) {
return (n<=2) ? 1 : f(n-1)+f(n-2);
}
}
alert(Y_memo(fibonacci_gen)(50));
// 使用例3: アッカーマン関数
function ackermann_gen(f){
return function(m, n) {
if (m == 0) return n+1;
else if (n == 0) return f(m-1, 1);
else return f(m-1, f(m, n-1));
}
}
alert(Y_memo(ackermann_gen)(3, 4));