“斜め方向から fib を高速化する方法”を JavaScript で


SpiderMonkey がタコなのか、はたまた私の JavaScript力がたんに足りないだけなのか、いずれにしてもかなりひどいことになってしまっていますが、JavaScript で許されている範囲で件の Squeak Smalltalk ならではの「斜め」を実現しようとすると、こんなふうになります。まあ、Smalltalk は読めない…という方に、雰囲気だけでもお伝えできればと。

function fib(n) {
  function fib1(n, a, b) {
    if(n>1) fib2(n-1, a, b);
    var my = arguments.callee;
    var mine = a+b;
    var caller = my.caller;
    var k = 3;
    while (caller && --k) {
      caller.arguments[k] = mine;
      caller = caller.caller
    }
    return a+b
  }
  function fib2(n, a, b) {
    if(n>1) fib3(n-1, a, b);
    var my = arguments.callee;
    var mine = a+b;
    var caller = my.caller;
    var k = 3;
    while (caller && --k) {
      caller.arguments[k] = mine;
      caller = caller.caller
    }
    return a+b
  }
  function fib3(n, a, b) {
    if(n>1) fib1(n-1, a, b);
    var my = arguments.callee;
    var mine = a+b;
    var caller = my.caller;
    var k = 3;
    while (caller && --k) {
      caller.arguments[k] = mine;
      caller = caller.caller
    }
    return a+b
  }
  return fib1(n, 0, 1)
}


追記
id:edvakfさんが、すっきりと書き直してくださいました。