Bird
Raised Fist0
DSA Typescriptprogramming~5 mins

Memoization to Optimize Recursion in DSA Typescript - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is memoization in the context of recursion?
Memoization is a technique to store the results of expensive function calls and reuse them when the same inputs occur again, avoiding repeated calculations.
Click to reveal answer
beginner
How does memoization improve recursive function performance?
By saving results of subproblems, memoization prevents the function from recalculating the same values multiple times, reducing time complexity from exponential to linear in many cases.
Click to reveal answer
beginner
In TypeScript, what data structure is commonly used to implement memoization?
A JavaScript object or Map is commonly used to store computed results with input parameters as keys for quick lookup.
Click to reveal answer
intermediate
Explain with a simple example how memoization works in a Fibonacci recursive function.
In a Fibonacci function, memoization stores the result of fib(n) after computing it once. When fib(n) is needed again, the stored value is returned immediately instead of recalculating fib(n-1) and fib(n-2).
Click to reveal answer
intermediate
What is the difference between memoization and tabulation?
Memoization is a top-down approach that caches results during recursion, while tabulation is a bottom-up approach that builds a table iteratively without recursion.
Click to reveal answer
What does memoization primarily help to reduce in recursive functions?
ANumber of function parameters
BRepeated calculations of the same subproblems
CMemory usage by deleting variables
DCode length
Which data structure is best suited for memoization in TypeScript?
AMap or Object
BArray
CSet
DString
What is the time complexity improvement when using memoization on Fibonacci recursion?
AFrom O(n) to O(1)
BNo improvement
CFrom O(2^n) to O(n)
DFrom O(n^2) to O(n^3)
Memoization is an example of which programming technique?
AGreedy algorithm
BBrute force
CDivide and conquer
DDynamic programming
Which of the following is NOT true about memoization?
AIt always reduces space complexity
BIt uses extra memory to store results
CIt avoids repeated recursive calls
DIt can be implemented using a cache
Describe how memoization optimizes a recursive Fibonacci function.
Think about how repeated calls to fib(n) are handled.
You got /4 concepts.
    Explain the difference between memoization and tabulation in dynamic programming.
    Consider the order of solving subproblems.
    You got /4 concepts.

      Practice

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

      Solution

      1. Step 1: Understand recursion inefficiency

        Recursive functions often repeat the same calculations multiple times, which wastes time.
      2. Step 2: Role of memoization

        Memoization saves the results of these repeated calculations in a storage (like an object) so they can be reused without recalculating.
      3. Final Answer:

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

        Memoization = Store and reuse results [OK]
      Hint: Memoization saves repeated results to speed up recursion [OK]
      Common Mistakes:
      • Thinking memoization slows down the function
      • Confusing memoization with iteration
      • Believing memoization removes recursion
      2. Which of the following is the correct way to declare a memo object in TypeScript for memoization?
      easy
      A. let memo = []
      B. const memo: Record = {}
      C. var memo = 0
      D. const memo: string = ''

      Solution

      1. Step 1: Identify memo storage type

        Memoization requires a storage that maps input (number) to output (number), so an object with number keys and number values is suitable.
      2. Step 2: Check TypeScript syntax

        Record correctly types an object with number keys and number values.
      3. Final Answer:

        const memo: Record = {} -> Option B
      4. Quick Check:

        Memo object type = Record [OK]
      Hint: Use Record for memo object in TypeScript [OK]
      Common Mistakes:
      • Using array instead of object for memo
      • Declaring memo as a number or string
      • Not initializing memo as an empty object
      3. What will be the output of the following TypeScript code?
      function fib(n: number, memo: Record = {}): number {
        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. 13

      Solution

      1. Step 1: Understand Fibonacci sequence

        Fibonacci numbers start as 0,1,1,2,3,5,8,... The 5th Fibonacci number (0-based) is 5.
      2. Step 2: Trace fib(5) call

        fib(5) = fib(4) + fib(3) = 3 + 2 = 5, memoization avoids repeated calls.
      3. Final Answer:

        5 -> Option A
      4. Quick Check:

        fib(5) = 5 [OK]
      Hint: Remember Fibonacci sequence values for small n [OK]
      Common Mistakes:
      • Confusing index starting at 0 or 1
      • Ignoring memoization effect on output
      • Calculating fib(5) as fib(6)
      4. Identify the error in this memoized factorial function and choose the correct fix:
      function factorial(n: number, memo: Record = {}): number {
        if (n === 0) return 1;
        if (memo[n]) return memo[n];
        memo[n] = n * factorial(n - 1, memo);
        return memo[n];
      }
      console.log(factorial(5));
      medium
      A. Remove memo parameter from function
      B. Add base case for n === 1
      C. Change if (memo[n]) to if (memo[n] !== undefined)
      D. Initialize memo as an array instead of object

      Solution

      1. Step 1: Understand memo check issue

        Checking if (memo[n]) fails when memo[n] is 0 or falsy, but factorial values are always positive, so 0 is not possible here, but better to check for undefined explicitly.
      2. Step 2: Fix condition to check existence properly

        Use if (memo[n] !== undefined) to correctly detect cached values.
      3. Final Answer:

        Change if (memo[n]) to if (memo[n] !== undefined) -> Option C
      4. Quick Check:

        Check memo existence with !== undefined [OK]
      Hint: Check memo keys with !== undefined to avoid false negatives [OK]
      Common Mistakes:
      • Using if(memo[n]) which fails for falsy cached values
      • Adding unnecessary base case for n=1
      • Removing memo parameter breaks memoization
      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 implements this in TypeScript?
      hard
      A. function climb(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n] !== undefined) return memo[n]; memo[n] = climb(n - 1, memo) + climb(n - 2, memo); return memo[n]; }
      B. function climb(n: number): number { if (n <= 1) return 1; return climb(n - 1) + climb(n - 2); }
      C. function climb(n: number, memo: number[] = []): number { if (n <= 1) return 1; if (memo[n]) return memo[n]; memo[n] = climb(n - 1, memo) * climb(n - 2, memo); return memo[n]; }
      D. function climb(n: number, memo: Record = {}): number { if (n === 0) return 0; if (memo[n]) return memo[n]; memo[n] = climb(n - 1, memo) + climb(n - 2, memo); return memo[n]; }

      Solution

      1. Step 1: Understand problem base cases

        Number of ways to climb 0 or 1 stairs is 1 (one way: stand still or one step).
      2. Step 2: Check memoization and recursion logic

        function climb(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n] !== undefined) return memo[n]; memo[n] = climb(n - 1, memo) + climb(n - 2, memo); return memo[n]; } correctly uses memo object, checks with !== undefined, and sums ways from n-1 and n-2 stairs.
      3. Step 3: Identify errors in other options

        function climb(n: number): number { if (n <= 1) return 1; return climb(n - 1) + climb(n - 2); } lacks memoization, function climb(n: number, memo: number[] = []): number { if (n <= 1) return 1; if (memo[n]) return memo[n]; memo[n] = climb(n - 1, memo) * climb(n - 2, memo); return memo[n]; } multiplies instead of sums, function climb(n: number, memo: Record = {}): number { if (n === 0) return 0; if (memo[n]) return memo[n]; memo[n] = climb(n - 1, memo) + climb(n - 2, memo); return memo[n]; } returns 0 for n=0 which is incorrect.
      4. Final Answer:

        Option A code correctly implements memoized climb function -> Option A
      5. Quick Check:

        Memo + sum of previous two = correct climb ways [OK]
      Hint: Sum ways for n-1 and n-2 with memo check !== undefined [OK]
      Common Mistakes:
      • Forgetting memoization causing slow recursion
      • Multiplying instead of adding ways
      • Wrong base case for n=0
      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