Эта задача является продолжением задачи memo.
Допустим, у нас есть чистая функция, которая считает сумму аргументов. Но работает она долго.
function sum(a, b) { // холостой цикл на миллиард шагов // занимает примерно секунду for(let i = 0; i < 1e9; i++); return a + b; } sum(2, 3) === 5 // ≈ 1s
Ваша задача реализовать функцию-декоратор memo
:
const mSum = memo(sum); mSum(1, 1) === 2 // ≈ 1s mSum(1, 1) === 2 // ≈ 0.001s mSum(2, 4) === 6 // ≈ 1s mSum(1, 1) === 2 // ≈ 0.001s mSum(2, 4) === 6 // ≈ 0.001s
Функция то функция fn
(аргумент memo
) может принимать произвольное количество аргументов. Аргументы могут быть любого типа. Например, числа, строки, объекты или функции.
Может быть и такая функция:
const sum = (...args) => args.reduce((a, b) => a + b, 0); const mSum = memo(sum); mSum(1, 1) === 2 // ≈ 1s mSum(2, 4) === 6 // ≈ 1s mSum(1, 1) === 2 // ≈ 0.001s mSum(1) === 1 // ≈ 1s mSum(2, 4) === 6 // ≈ 0.001s mSum(1) === 1 // ≈ 0.001s