function memoize(fun) {
let memo = new Map();
return x => {
if (x in memo) {
return memo[x];
}
let r = fun(x);
memo[x] = r;
return r;
}
}
function fibonacci(x) {
return (x <= 1) ? x :
fibonacci(x - 1) + fibonacci(x - 2);
}
let memFibonacci = memoize(fibonacci)
for (let i in [1, 2]) {
let start = new Date();
let f37 = memFibonacci(37);
let milliseconds = (new Date()) - start;
console.log(`${i}: f37 is ${f37}`);
console.log(`${i}: milliseconds is ${milliseconds}`);
}
// prints:
// 1: f37 is 24157817
// 1: milliseconds is 245
// 2: f37 is 24157817
// 2: milliseconds is 0
let start = new Date();
let f38 = memFibonacci(38);
let milliseconds = (new Date()) - start;
console.log(`f38 is ${f38}`);
console.log(`milliseconds is ${milliseconds}`);
// f38 is 39088169
// milliseconds is 357
| Данный способ мемоизации хорошо работает с нерекурсивными функциями. Поскольку запоминает только результат первого вызова функции. |