2023-04-14 14:39:57 +08:00
< p > Given a function < code > fn< / code > , return a < strong > memoized< / strong > version of that function.< / p >
2023-12-09 18:42:21 +08:00
< p > A < strong > memoized < / strong > function is a function that will never be called twice with the same inputs. Instead it will return a cached value.< / p >
2023-04-14 14:39:57 +08:00
< p > You can assume there are < strong > 3 < / strong > possible input functions: < code > sum< / code > < strong > , < / strong > < code > fib< / code > < strong > , < / strong > and < code > factorial< / code > < strong > .< / strong > < / p >
< ul >
< li > < code > sum< / code > < strong > < / strong > accepts two integers < code > a< / code > and < code > b< / code > and returns < code > a + b< / code > .< / li >
< li > < code > fib< / code > < strong > < / strong > accepts a single integer < code > n< / code > and returns < code > 1< / code > if < font face = "monospace" > < code > n < = 1< / code > < / font > or< font face = "monospace" > < code > fib(n - 1) + fib(n - 2)< / code > < / font > otherwise.< / li >
< li > < code > factorial< / code > accepts a single integer < code > n< / code > and returns < code > 1< / code > if < code > n < = 1< / code > or < code > factorial(n - 1) * n< / code > otherwise.< / li >
< / ul >
< p > < / p >
< p > < strong class = "example" > Example 1:< / strong > < / p >
< pre >
2023-12-09 18:42:21 +08:00
< strong > Input:< / strong >
fnName = " sum"
actions = [" call" ," call" ," getCallCount" ," call" ," getCallCount" ]
values = [[2,2],[2,2],[],[1,2],[]]
< strong > Output:< / strong > [4,4,1,3,2]
< strong > Explanation:< / strong >
2023-04-14 14:39:57 +08:00
const sum = (a, b) => a + b;
const memoizedSum = memoize(sum);
2023-12-09 18:42:21 +08:00
memoizedSum(2, 2); // " call" - returns 4. sum() was called as (2, 2) was not seen before.
memoizedSum(2, 2); // " call" - returns 4. However sum() was not called because the same inputs were seen before.
// " getCallCount" - total call count: 1
memoizedSum(1, 2); // " call" - returns 3. sum() was called as (1, 2) was not seen before.
// " getCallCount" - total call count: 2
2023-04-14 14:39:57 +08:00
< / pre >
< p > < strong class = "example" > Example 2:< / strong > < / p >
< pre >
2023-12-09 18:42:21 +08:00
< strong > Input:
< / strong > fnName = " factorial"
actions = [" call" ," call" ," call" ," getCallCount" ," call" ," getCallCount" ]
values = [[2],[3],[2],[],[3],[]]
< strong > Output:< / strong > [2,6,2,2,6,2]
< strong > Explanation:< / strong >
2023-04-14 14:39:57 +08:00
const factorial = (n) => (n < = 1) ? 1 : (n * factorial(n - 1));
const memoFactorial = memoize(factorial);
2023-12-09 18:42:21 +08:00
memoFactorial(2); // " call" - returns 2.
memoFactorial(3); // " call" - returns 6.
memoFactorial(2); // " call" - returns 2. However factorial was not called because 2 was seen before.
// " getCallCount" - total call count: 2
memoFactorial(3); // " call" - returns 6. However factorial was not called because 3 was seen before.
// " getCallCount" - total call count: 2
2023-04-14 14:39:57 +08:00
< / pre >
< p > < strong class = "example" > Example 3:< / strong > < / p >
< pre >
2023-12-09 18:42:21 +08:00
< strong > Input:
< / strong > fnName = " fib"
actions = [" call" ," getCallCount" ]
values = [[5],[]]
< strong > Output:< / strong > [8,1]
< strong > Explanation:
< / strong > fib(5) = 8 // " call"
// " getCallCount" - total call count: 1
2023-04-14 14:39:57 +08:00
< / pre >
< p > < / p >
< p > < strong > Constraints:< / strong > < / p >
< ul >
< li > < code > 0 < = a, b < = 10< sup > 5< / sup > < / code > < / li >
< li > < code > 1 < = n < = 10< / code > < / li >
2023-12-09 18:42:21 +08:00
< li > < code > 0 < = actions.length < = 10< sup > 5< / sup > < / code > < / li >
< li > < code > actions.length === values.length< / code > < / li >
< li > < code > actions[i]< / code > is one of " call" and " getCallCount" < / li >
< li > < code > fnName< / code > is one of " sum" , " factorial" and " fib" < / li >
2023-04-14 14:39:57 +08:00
< / ul >