Memoized Functions

const Memoize = (fn) => {
  const cache = {};

  return (...args) => {
    let argsToJson = JSON.stringify(args);

    if (argsToJson in cache) {
      console.log("Returned from Cache");
      return cache[argsToJson];
    }

    let result = fn.apply(this, args);
    cache[argsToJson] = result;
    console.log("Returned after Calculating");
    return result;
  };
};

const addThreeNumbers = (a, b, c) => a + b + c;
const add = Memoize(addThreeNumbers);

console.log(add(1, 2, 3));
console.log(add(4, 5, 6));
console.log(add(1, 2, 3));

// Output:
Returned after Calculating
6
Returned after Calculating
15
Returned from Cache
6

Recursive Memoized Factorial Function

const Factorial = Memoize((num) => {
  if (num === 1) return 1;
  return num * Factorial(num - 1);
});

console.log(Factorial(5));
console.log(Factorial(6));
console.log(Factorial(4));

// Output:
Returned after Calculating
Returned after Calculating
Returned after Calculating
Returned after Calculating
Returned after Calculating
120
Returned from Cache
Returned after Calculating
720
Returned from Cache
24