Объяснение
Мемоизированная функция кэширует возвращаемое значение для различных комбинаций аргументов для повышения производительности. В решении мы создаем функцию высшего порядка 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