var pr = print;//console.log;
function timeDiff(startTime, digits) {
digits = digits || 1;
return ((Date.now()-startTime)/1000).toFixed(digits)+'s';
}
function fib(n) {
if (n < 2) return 1;
else return fib(n-1)+fib(n-2);
}
function memo(fn) {
var cache = {};
return function() {
var args = JSON.stringify(arguments);
if (cache.hasOwnProperty(args)) {
return cache[args];
} else {
var result = fn.apply(this, arguments);
cache[args] = result;
return result;
}
}
}
function testFn(fn, nmax, nmin=0) {
for (var i=0; i <= nmax; i++) {
var t = Date.now();
var result = fib(i);
pr('n:',i, result, 'time:',timeDiff(t,3),'sec');
}
}
pr('SIMPLE');
testFn(fib, 40);
fib = memo(fib);
pr('MEMOIZED');
testFn(fib, 40);
CnZhciBwciA9IHByaW50Oy8vY29uc29sZS5sb2c7CgpmdW5jdGlvbiB0aW1lRGlmZihzdGFydFRpbWUsIGRpZ2l0cykgewogICAgZGlnaXRzID0gZGlnaXRzIHx8IDE7CiAgICByZXR1cm4gKChEYXRlLm5vdygpLXN0YXJ0VGltZSkvMTAwMCkudG9GaXhlZChkaWdpdHMpKydzJzsKfQoKZnVuY3Rpb24gZmliKG4pIHsKICAgIGlmIChuIDwgMikgcmV0dXJuIDE7CiAgICBlbHNlIHJldHVybiBmaWIobi0xKStmaWIobi0yKTsKfQoKZnVuY3Rpb24gbWVtbyhmbikgewogICAgdmFyIGNhY2hlID0ge307CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBKU09OLnN0cmluZ2lmeShhcmd1bWVudHMpOwogICAgICAgIGlmIChjYWNoZS5oYXNPd25Qcm9wZXJ0eShhcmdzKSkgewogICAgICAgICAgICByZXR1cm4gY2FjaGVbYXJnc107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGNhY2hlW2FyZ3NdID0gcmVzdWx0OwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gdGVzdEZuKGZuLCBubWF4LCBubWluPTApIHsKICAgIGZvciAodmFyIGk9MDsgaSA8PSBubWF4OyBpKyspIHsKICAgICAgICB2YXIgdCA9IERhdGUubm93KCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IGZpYihpKTsKICAgICAgICBwcignbjonLGksIHJlc3VsdCwgJ3RpbWU6Jyx0aW1lRGlmZih0LDMpLCdzZWMnKTsKICAgIH0gICAgCn0KCnByKCdTSU1QTEUnKTsKdGVzdEZuKGZpYiwgNDApOwoKZmliID0gbWVtbyhmaWIpOwoKcHIoJ01FTU9JWkVEJyk7CnRlc3RGbihmaWIsIDQwKTs=