Допустим, у нас есть чистая функция double
, принимающая число и умножающая его на два. Но работает она долго.
function double(x) { // холостой цикл на миллиард шагов // занимает примерно секунду for(let i = 0; i < 1e9; i++); return x * 2; } console.time("10"); console.log(double(10)); 20 console.timeEnd("10"); // ≈ 1s
Ваша задача реализовать функцию-декоратор memo
. Эта функция принимает один аргумент fn
и возвращает новую функцию, которая делает то же самое, но не вычисляет результат для тех же аргументов повторно.
const mDouble = memo(double); console.time("A"); console.log(mDouble(1)) // 2 console.timeEnd("A"); // ≈ 1s console.time("B"); console.log(mDouble(1)) // 2 console.timeEnd("B"); // ≈ 0.001s console.time("C"); console.log(mDouble(3)) // 6 console.timeEnd("C"); // ≈ 1s console.time("D"); console.log(mDouble(1)) // 2 console.timeEnd("D"); // ≈ 0.001s console.time("E"); console.log(mDouble(3)) // 6 console.timeEnd("E"); // ≈ 0.001s
Гарантируется, что функция fn
(аргумент memo
) вызывается с одним аргументом. Но этот аргумент может быть любого типа. Например, число, строка, объект или функция.
В задаче memo-advanced необходимо реализовать такую же функцию memo
, но fn
может принимать произвольное количество аргументов.