Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@pointofpresence
Last active March 31, 2024 20:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pointofpresence/e5df57bb37a87b4d71df11356453820f to your computer and use it in GitHub Desktop.
Save pointofpresence/e5df57bb37a87b4d71df11356453820f to your computer and use it in GitHub Desktop.
Функция memoize() сохраняет результаты каждого вызова принимаемой функции в виде [ключ:значение].
// Приведенная ниже функция memoize() сохраняет результаты каждого вызова принимаемой функции в виде [ключ:значение].
// Функция, генерирующая ключ исходя из параметров
const generateKey = args => (
args.map(x => `${x.toString()}:${typeof(x)}`).join('|') // Результат: "x1:number|x2:number|..."
);
// Принимает функцию в качестве параметра
const memoize = fn => {
const cache = {};
return (...args) => {
// Генерирует ключ для сохранения результата
const key = generateKey(args);
const val = cache[key];
// Проверяет, существует по данному ключу какое-либо значение и возвращает его, если оно есть
if (val) return val;
// Сохраняет результат вызова функции
const res = fn(...args);
cache[key] = res;
// Возвращает результат
return res;
};
};
// С помощью нее мы можем избежать повторного выполнения вычислений в случае, если они уже были произведены.
// Функция, находящая сумму чисел от a до b
const sumSeq = (a, b) => {
console.log('Calculate sum');
let r = 0;
for (let i = a; i < b; i++) r += i;
return r;
};
// Производим мемоизацию функции sumSeq
const mSumSeq = memoize(sumSeq);
console.log('First call mSumSeq(2, 5)');
console.log('Value: ' + mSumSeq(2, 5)); // Выводит в консоль "9"
console.log('Second call mSumSeq(2, 5)');
console.log('From cache: ' + mSumSeq(2, 5)); // Выводит в консоль "9"
console.log('Call mSumSeq(2, 6)');
console.log('Calculated: ' + mSumSeq(2, 6)); // Выводит в консоль "14"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment