Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
// noprotect
function fib1(n) {
  if(n <= 2) {
    return 1;
  } else {
    var a = fib1(n - 1);
    var b = fib1(n - 2);
    return a + b;
  }
}
// https://en.wikipedia.org/wiki/Call_stack#Structure
function fib2(n) {
  var fiber = { arg: n, returnAddr: null, a: 0 /* b is tail call */ };
  rec: while (true) {
    if (fiber.arg <= 2) {
      var sum = 1;
      while (fiber.returnAddr) {
        fiber = fiber.returnAddr;
        if (fiber.a === 0) {
          fiber.a = sum;
          fiber = { arg: fiber.arg - 2, returnAddr: fiber, a: 0 };
          continue rec;
        }
        sum += fiber.a;
      }
      return sum;
    } else {
      fiber = { arg: fiber.arg - 1, returnAddr: fiber, a: 0 };
    }
  }
}
var p = performance;
var c = 33;
for (var i = 0; i < 10; i++) {
  fib1(c);
  fib1(c);
  fib2(c);
  fib2(c);
}
fib1(c);
console.log('result stack', fib1(c));
fib2(c);
console.log('result fiber', fib2(c));
var s1 = p.now();
fib1(c);
var e1 = p.now();
var s2 = p.now();
fib2(c);
var e2 = p.now();
console.log('stack', e1 - s1);
console.log('fiber', e2 - s2);
var s1 = p.now();
fib1(c);
var e1 = p.now();
var s2 = p.now();
fib2(c);
var e2 = p.now();
console.log('stack', e1 - s1);
console.log('fiber', e2 - s2);
Output

This bin was created anonymously and its free preview time has expired (learn why). — Get a free unrestricted account

Dismiss x
public
Bin info
anonymouspro
0viewers