function tco(f) {
var value;
var active = false;
var accumulated = [];
return function accumulator() {
accumulated.push(arguments);
if (!active) {
active = true;
while (accumulated.length) {
value = f.apply(this, accumulated.shift());
}
active = false;
return value;
}
};
}
var factorial = tco(function(n, total) {
‘use strict’
if (n === 1) {
return total;
}
return factorial(n - 1, n * total);
});
factorial(50000, 1);