Объяснение
Мемоизированная функция кэширует возвращаемое значение для различных комбинаций аргументов для повышения производительности. В решении мы создаем функцию высшего порядка memoize(), которая определяет кэш локальных переменных. Объект кэша находится в замыкании возвращаемой функции. Когда возвращаемая функция вызывается вне memoize(), она сначала проверяет, вызывалась ли ранее такая же комбинация аргументов; если да, она просто возвращает ту, которая хранится в кеше, в противном случае она вызывает функцию f и сохраняет возвращаемое значение. в кэше. Обратите внимание, что решение предполагает, что все аргументы f имеют разные строковые представления.
Решение
function memoize(f) { var cache = {}; return function() { var key = arguments.length + Array.prototype.join.call(arguments,","); if (key in cache) { return cache[key]; } else { return cache[key] = f.apply(this, arguments); } }; }
Дополнительный вопрос
Напишите рекурсивную функцию, которая возвращает факториал числа, а затем используйте функцию memoize, чтобы преобразовать ее в запомненную версию.
Объяснение
Сложная часть этого продолжения заключается в том, что вам нужно вернуться к запомненной версии, а не к исходной. Разница между правильным решением и неправильным решением заключается в том, что, например, при вызове memoized_factorial(5) правильная версия также будет кэшировать значения для 4, 3, 2 и 1, тогда как неправильная версия кэширует только 5.
Правильное решение
var memoized_factorial = memoize(function(n) { return (n <= 1) ? 1 : n * memoized_factorial(n - 1); });
Неправильное решение
var memoized_factorial = memoize(function factorial(n) { return (n <= 1) ? 1 : n * factorial(n - 1); });
Компания
Uber