Fibonacci Y Combinator (v9)

Revision 9 of this benchmark created by lawrence rao on


Preparation HTML

<script>
  var r5 = Math.sqrt(5);
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Y combinator with memoization
function Ymem(F, cache) {
  if (!cache) cache = {}; // Create a new cache.
  return function(arg) {
    if (cache[arg]) return cache[arg]; // Answer in cache.
    var answer = (F(function(n) {
      return (Ymem(F, cache))(n);
    }))(arg); // Compute the answer.
    cache[arg] = answer; // Cache the answer.
    return answer;
  };
}

var fib4 = Ymem(function(g) {
  return (function(n) {
    if (n == 0) return 0;
    if (n == 1) return 1;
    return g(n - 1) + g(n - 2);
  });
});

fib4(200);
fib4(200);
ready
direct
function fibonacci_direct(n) {
  if (n < 2) return n;
  return (Math.pow((1 + r5) / 2, n) - Math.pow((1 - r5) / 2, n)) / r5;
}
fibonacci_direct(200);
fibonacci_direct(200);
ready
loop
function fibonacci_loop(n) {
  if (n < 2) return n;
  var previous = 0;
  var current = 1;
  var next;
  for (var i = 1; i < n; i++) {
    next = previous + current;
    previous = current;
    current = next;
  }
  return current;
}
fibonacci_loop(200);
fibonacci_loop(200);
ready
Just Messin' Around
var fibByIndex = function(n) {
  if (n <= 1) {
    return n;
  }
  return FibulaOblongata(n - 1) + FibulaOblongata(n - 2);
}

var memoize = function(fn) {
  var cache = {};
  return function(arg) {
    if (arg in cache) {
      return cache[arg];
    }
    cache[arg] = fn(arg);
    return cache[arg];
  };
}

FibulaOblongata = memoize(fibByIndex);

FibulaOblongata(200);
FibulaOblongata(200);
ready
fast loop
function fib_fastloop(n) {
  var half = Math.floor((n - 1) / 2);
  for (var i = 0, a = 0, b = 1; i < half; i++, b += (a += b)) {}
  return n % 2 == 0 ? b : a;
}
fib_fastloop(200);
fib_fastloop(200);
ready
recursive with memoization
function fib2(n) {
  if (n == 0) return 0;
  if (n == 1) return 1;
  return fib2(n - 1) + fib2(n - 2);
}

function memo(f) {
  var cache = {}
  return function(x) {
    if (typeof cache[x] === 'undefined') {
      cache[x] = f(x);
    }
    return cache[x];
  }
}
fib2 = memo(fib2);

fib2(200);
fib2(200);
ready
Y combinator
var Y = function(F) {
  return (function(x) {
    return F(function(y) {
      return (x(x))(y);
    });
  })(function(x) {
    return F(function(y) {
      return (x(x))(y);
    });
  });
};

var FactGen = function(fact) {
  return (function(n) {
    return ((n == 0) ? 1 : (n * fact(n - 1)));
  });
};
fib3 = (Y(FactGen))

fib3(200);
fib3(200);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.