Рассмотрим нахождение n-го числа Фибоначчи. Необработанные функции fib(32)
и _.memoize(fib)(32)
занимают одно и то же время.
function fib(num) {
if (num <= 1) return 1;
return fib(num - 1) + fib(num - 2);
}
// slow
console.time('with memo')
_.memoize(fib)(32)
console.timeEnd('with memo')
// slow
console.time('no memo')
fib(32)
console.timeEnd('no memo')
Вы увидите, что оба займут примерно одинаковое время. Без улучшения производительности. Есть ли способ изменить функцию memoize
, чтобы создать настоящую памятку, которая эквивалентна реализации заметки внутри самого fib
? Ака, я хочу, чтобы производительность была такой же:
// true memoization, actual performance improvement
// very fast!
cache = {}
function fib(n) {
if (!cache[n]){
if (n <= 1) cache[n] = 1;
else cache[n] = fib(n - 1) + fib(n - 2);
}
return cache[n]
}