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