Мемоизация с объектами и массивами в аргументах (Memoize with Object Arguments)
3
Кэширование
Условие: Реализуйте функцию memoize(fn), которая возвращает мемоизированную версию fn. Аргументы могут быть примитивами, массивами и объектами (в Python dict и list), в том числе вложенными. Два вызова считаются одинаковыми, если их аргументы равны по структуре, а не по ссылке. При повторном вызове с равными аргументами результат берётся из кэша и fn не вызывается.
Правила сравнения:
порядок ключей в объекте не важен:
{a: 1, b: 2}и{b: 2, a: 1}считаются одним и тем же аргументом;порядок элементов в массиве важен:
[1, 2]и[2, 1]разные аргументы;типы различаются:
1и"1"разные аргументы;порядок аргументов важен:
fn(a, b)иfn(b, a)кэшируются отдельно.
Входные данные: Функция fn и последовательность вызовов мемоизированной версии с аргументами.
Выходные данные: Мемоизированная функция. Тесты проверяют возвращаемые значения и количество реальных вызовов fn.
Ограничения:
0 <= число аргументов <= 5глубина вложенности не более 5
значения: числа, строки, булевы,
null, массивы, объектынет циклических ссылок, функций и
undefined
Пример:
Вход: fn = (obj, arr) => obj.a + arr.length
memoized({a: 1, b: 2}, [1, 2])→3(вычисляется,fnвызвана 1 раз)memoized({b: 2, a: 1}, [1, 2])→3(из кэша,fnвызвана 1 раз)memoized({a: 1, b: 2}, [2, 1])→3(вычисляется,fnвызвана 2 раза)