Если требуется мемоизировать sum, кешируйте результат по паре аргументов, проверяя наличие ключа, а не truthy-значение результата.
function sum(a, b) {
Если требуется мемоизировать sum, кешируйте результат по паре аргументов, проверяя наличие ключа, а не truthy-значение результата.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
function sum(a, b) { return a + b; }
function memo() {}
Ответ
Если требуется мемоизировать sum, кешируйте результат по паре аргументов, проверяя наличие ключа, а не truthy-значение результата.
Предполагаем чистую функцию двух конечных чисел. Для произвольных объектов и переменного числа аргументов нужен другой контракт.
function memo(fn) {
const cache = new Map();
const key = n => Object.is(n, -0) ? '-0' : String(n);
return (a, b) => {
if (!Number.isFinite(a) || !Number.isFinite(b))
throw new TypeError('Нужны два конечных числа');
const k = key(a) + ':' + key(b);
if (cache.has(k)) return cache.get(k);
const value = fn(a, b);
cache.set(k, value);
return value;
};
}
const cachedSum = memo(sum);
Нулевой результат кешируется корректно, знак нуля различается. Кеш растёт с числом уникальных пар, поэтому в долгоживущем приложении нужен лимит или очистка.