Bird
Raised Fist0
DSA Javascriptprogramming~3 mins

Why Memoization to Optimize Recursion in DSA Javascript?

Choose your learning style10 modes available
The Big Idea

What if you could make slow, repetitive calculations instantly fast by remembering past answers?

The Scenario

Imagine you are trying to calculate the Fibonacci number for a large position by hand, writing down every step again and again.

Each time you need a smaller Fibonacci number, you redo all the calculations from scratch.

The Problem

This manual method is very slow because you repeat the same calculations many times.

It is easy to make mistakes and waste time, especially for big numbers.

The Solution

Memoization remembers the results of previous calculations.

When the same calculation is needed again, it uses the saved answer instead of recalculating.

This makes the process much faster and less error-prone.

Before vs After
✗ Before
function fib(n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}
✓ After
const memo = {};
function fib(n) {
  if (n <= 1) return n;
  if (memo[n] !== undefined) return memo[n];
  memo[n] = fib(n - 1) + fib(n - 2);
  return memo[n];
}
What It Enables

Memoization enables fast and efficient solutions to problems that involve repeated calculations.

Real Life Example

Calculating the number of ways to climb stairs when you can take one or two steps at a time.

Memoization helps avoid recalculating the number of ways for the same step multiple times.

Key Takeaways

Manual recursion repeats work and is slow.

Memoization stores results to avoid repeated work.

This makes recursive solutions much faster and practical.

Practice

(1/5)
1. What is the main purpose of using memoization in recursive functions?
easy
A. To make the function run slower by adding extra steps
B. To store results of expensive function calls and reuse them later
C. To avoid using recursion altogether
D. To increase the number of recursive calls

Solution

  1. Step 1: Understand what memoization does

    Memoization saves the results of function calls so that if the same inputs occur again, the saved result is used instead of recalculating.
  2. Step 2: Identify the effect on recursion

    This reduces repeated work and speeds up recursive functions by avoiding duplicate calculations.
  3. Final Answer:

    To store results of expensive function calls and reuse them later -> Option B
  4. Quick Check:

    Memoization = Store and reuse results [OK]
Hint: Memoization saves repeated work to speed recursion [OK]
Common Mistakes:
  • Thinking memoization makes recursion slower
  • Confusing memoization with iteration
  • Believing memoization removes recursion
2. Which of the following is the correct way to declare a memo object inside a recursive function in JavaScript?
easy
A. const memo = {}; inside the function, then pass it as a parameter
B. var memo = []; inside the function without passing it
C. let memo = 0; inside the function
D. memo = new Map(); outside the function and never pass it

Solution

  1. Step 1: Understand memo object usage

    The memo object should be an object or map to store key-value pairs of inputs and results.
  2. Step 2: Correct placement and passing

    Declaring const memo = {} inside the function and passing it as a parameter ensures the same memo is used across recursive calls.
  3. Final Answer:

    const memo = {}; inside the function, then pass it as a parameter -> Option A
  4. Quick Check:

    Memo object declared and passed = const memo = {}; inside the function, then pass it as a parameter [OK]
Hint: Declare memo as object and pass it to recursive calls [OK]
Common Mistakes:
  • Using array instead of object for memo
  • Not passing memo to recursive calls
  • Declaring memo as a number
3. What will be the output of the following code?
function fib(n, memo = {}) {
  if (n <= 1) return n;
  if (memo[n]) return memo[n];
  memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
  return memo[n];
}
console.log(fib(5));
medium
A. 5
B. 8
C. 3
D. Undefined

Solution

  1. Step 1: Understand Fibonacci calculation with memoization

    fib(5) calculates Fibonacci number at position 5 using memo to avoid repeated calls.
  2. Step 2: Calculate fib(5) step-by-step

    fib(0)=0, fib(1)=1, fib(2)=1, fib(3)=2, fib(4)=3, fib(5)=5.
  3. Final Answer:

    5 -> Option A
  4. Quick Check:

    fib(5) = 5 [OK]
Hint: Remember Fibonacci sequence: 0,1,1,2,3,5... [OK]
Common Mistakes:
  • Confusing fib(5) with fib(6)
  • Ignoring memo and recalculating
  • Assuming output is 8
4. Identify the error in this memoized factorial function and choose the fix:
function factorial(n, memo = {}) {
  if (n === 0) return 1;
  if (memo[n]) return memo[n];
  memo[n] = n * factorial(n - 1);
  return memo[n];
}
medium
A. Remove memo object completely
B. Change base case to n === 1
C. Pass memo in recursive call: factorial(n - 1, memo)
D. Initialize memo as an array instead of object

Solution

  1. Step 1: Check recursive call parameters

    The recursive call to factorial misses passing the memo object, so memo is reset each time.
  2. Step 2: Fix by passing memo in recursion

    Change call to factorial(n - 1, memo) to keep memo consistent across calls.
  3. Final Answer:

    Pass memo in recursive call: factorial(n - 1, memo) -> Option C
  4. Quick Check:

    Pass memo to recursive calls to fix [OK]
Hint: Always pass memo object in recursive calls [OK]
Common Mistakes:
  • Forgetting to pass memo in recursion
  • Changing base case unnecessarily
  • Removing memo defeats optimization
5. You want to optimize a recursive function that calculates the number of ways to climb n stairs taking 1 or 2 steps at a time. Which memoization approach below correctly improves performance?
hard
A. Store results only for even stair numbers in memo
B. Use a global variable to count calls without storing results
C. Rewrite the function to use a loop without memoization
D. Use a memo object passed through recursive calls to store results for each stair number

Solution

  1. Step 1: Understand the problem and recursion

    The function counts ways to climb stairs by summing ways(n-1) and ways(n-2).
  2. Step 2: Apply memoization correctly

    Passing a memo object through recursive calls stores results for each stair number, avoiding repeated calculations.
  3. Step 3: Evaluate other options

    Global counters don't store results, loops change approach, and storing only even results misses odd cases.
  4. Final Answer:

    Use a memo object passed through recursive calls to store results for each stair number -> Option D
  5. Quick Check:

    Memo object for all inputs optimizes recursion [OK]
Hint: Memoize all inputs to avoid repeated stair count calculations [OK]
Common Mistakes:
  • Not passing memo object through recursion
  • Partial memoization missing some inputs
  • Confusing memoization with iteration
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard