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));