Мемоизация выполняется всегда по одному и тому же шаблону. Создаётся переменная, которая заполняется, если она была пустая, а затем используется для отдачи значения без выполнения вычислений. Её можно сделать с помощью одних лишь функций, на замыканиях (а значит придётся генерировать функцию). Ниже пример с мемоизацией факториала:
// Это просто функция вычисляющая факториал без мемоизации
const factorial = (num) => {
if (num === 0) {
return 1;
}
return num * factorial(num - 1);
}
// Эта функция выполняет мемоизацию факториала
const generateFactorialWithMemo = () => {
// Здесь будут храниться вычисленные значения
// Так как функция факториала применяется к разным аргументам, то для хранения результатов
// понадобится объект. В более простых случаях достаточно обычного значения (как в практике к этому уроку)
let memo = {};
// Эта функция возвращается наружу и именно она будет заниматься вычислением факториала
const f = (num) => {
// Если значение не мемоизированно, то мемоизируем
if (!memo[num]) {
memo[num] = factorial(num);
}
// Возвращаем значение из мемо
return memo[num];
}
return f;
};
const f = generateFactorialWithMemo();
// Значение вычисляется
f(3); // 6
// Значение не вычисляется
f(3); // 6
Отличительная черта мемоизации, которая отделяет её от кеширования — отсутствие устаревания. Данные внутри мемо устареть не могут по определению — ведь, если наша функция чистая, то для одного входа она всегда даёт один и тот же выход. А мемоизируют только чистые функции, иначе всегда есть риск сохранить результат, который впоследствии может поменяться.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Статья «Ловушки обучения»
Вебинар «Как самостоятельно учиться»
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт