Bird
Raised Fist0
DSA Cprogramming~20 mins

Memoization to Optimize Recursion in DSA C - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Memoization Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Fibonacci with Memoization
What is the output of the following C code that uses memoization to compute Fibonacci numbers?
DSA C
#include <stdio.h>

int fib(int n, int memo[]) {
    if (n <= 1) return n;
    if (memo[n] != -1) return memo[n];
    memo[n] = fib(n-1, memo) + fib(n-2, memo);
    return memo[n];
}

int main() {
    int n = 5;
    int memo[6];
    for (int i = 0; i <= n; i++) memo[i] = -1;
    int result = fib(n, memo);
    printf("%d\n", result);
    return 0;
}
A5
B8
C13
D3
Attempts:
2 left
💡 Hint
Recall that Fibonacci sequence starts with 0, 1, 1, 2, 3, 5...
🧠 Conceptual
intermediate
1:30remaining
Memoization Purpose in Recursion
What is the main purpose of using memoization in recursive functions?
ATo store intermediate results and avoid repeated calculations
BTo make the code shorter and easier to read
CTo increase the number of recursive calls
DTo convert recursion into iteration automatically
Attempts:
2 left
💡 Hint
Think about how recursion can repeat the same work multiple times.
🔧 Debug
advanced
2:00remaining
Identify the Error in Memoized Fibonacci
What error will occur when running this code snippet?
DSA C
#include <stdio.h>

int fib(int n, int memo[]) {
    if (n <= 1) return n;
    if (memo[n] != 0) return memo[n];
    memo[n] = fib(n-1, memo) + fib(n-2, memo);
    return memo[n];
}

int main() {
    int n = 5;
    int memo[6] = {0};
    int result = fib(n, memo);
    printf("%d\n", result);
    return 0;
}
AThe code prints 0 because memo array is initialized with zeros
BThe code runs correctly and prints 5
CThe code causes a segmentation fault
DThe code prints 1 instead of 5
Attempts:
2 left
💡 Hint
Check how memo array is initialized and how memo[n] is checked before recursion.
❓ Predict Output
advanced
2:00remaining
Output of Factorial with Memoization
What is the output of this C program that uses memoization to compute factorial?
DSA C
#include <stdio.h>

int fact(int n, int memo[]) {
    if (n <= 1) return 1;
    if (memo[n] != 0) return memo[n];
    memo[n] = n * fact(n-1, memo);
    return memo[n];
}

int main() {
    int n = 4;
    int memo[5] = {0};
    int result = fact(n, memo);
    printf("%d\n", result);
    return 0;
}
A120
B10
C0
D24
Attempts:
2 left
💡 Hint
Recall factorial 4! = 4*3*2*1
🚀 Application
expert
2:30remaining
Memoization Impact on Time Complexity
Consider a naive recursive function to compute Fibonacci numbers with exponential time complexity. After adding memoization, what is the new time complexity?
AO(2^n)
BO(n^2)
CO(n)
DO(log n)
Attempts:
2 left
💡 Hint
Memoization avoids repeated calls by storing results.

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 store results of expensive function calls and reuse them
C. To convert recursion into iteration automatically
D. To make the function run slower by adding extra steps

Solution

  1. Step 1: Understand what memoization does

    Memoization saves the results of function calls so they don't need to be recalculated.
  2. Step 2: Identify the benefit in recursion

    This reduces repeated work and speeds up recursive functions.
  3. Final Answer:

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

    Memoization = Store and reuse results [OK]
Hint: Memoization saves repeated results to speed recursion [OK]
Common Mistakes:
  • Thinking memoization slows down the function
  • Confusing memoization with converting recursion to loops
  • Believing memoization removes variables
2. Which of the following is the correct way to declare a memoization array for Fibonacci numbers in C?
easy
A. int memo[] = {1, 1};
B. int memo = 100;
C. int memo[100] = {0};
D. int memo(100);

Solution

  1. Step 1: Check valid C array declaration

    In C, arrays are declared with type, name, and size in square brackets.
  2. Step 2: Identify correct syntax

    int memo[100] = {0}; uses int memo[100] = {0}; which initializes all elements to zero correctly.
  3. Final Answer:

    int memo[100] = {0}; -> Option C
  4. Quick Check:

    Array declaration with size and initialization = int memo[100] = {0}; [OK]
Hint: Use int array[size] = {0} to initialize memo array [OK]
Common Mistakes:
  • Using parentheses instead of brackets for arrays
  • Assigning a single int instead of an array
  • Not initializing the array to zero
3. What will be the output of the following C code snippet using memoization for Fibonacci?
int memo[100] = {0};

int fib(int n) {
  if (n <= 1) return n;
  if (memo[n] != 0) return memo[n];
  memo[n] = fib(n-1) + fib(n-2);
  return memo[n];
}

int main() {
  printf("%d", fib(5));
  return 0;
}
medium
A. 5
B. 8
C. 3
D. 0

Solution

  1. Step 1: Trace fib(5) with memoization

    fib(5) = fib(4) + fib(3), and so on, with memo storing results to avoid repeats.
  2. Step 2: Calculate Fibonacci values

    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 fib(5) = 5 in Fibonacci sequence [OK]
Common Mistakes:
  • Confusing fib(5) with fib(6)
  • Ignoring memoization effect on output
  • Mistaking base cases
4. Identify the error in this memoized factorial function in C:
int memo[100] = {0};

int fact(int n) {
  if (n == 0) return 1;
  if (memo[n] != 0) return memo[n];
  memo[n] = n * fact(n - 1);
  return memo[n];
}

int main() {
  printf("%d", fact(5));
  return 0;
}
medium
A. Memo array is not initialized to -1 to detect uncalculated values
B. Base case should return 0 instead of 1
C. Function should use iteration, not recursion
D. Memo array size is too small

Solution

  1. Step 1: Understand memo check condition

    The code checks if memo[n] != 0 to decide if value is cached.
  2. Step 2: Identify problem with zero initialization

    Since factorial(0) = 1, memo[1] will be 0 initially, but 0 is a valid value for uninitialized. This causes confusion.
  3. Step 3: Correct approach

    Initialize memo array with -1 to mark uncalculated values, so 0 is a valid cached result.
  4. Final Answer:

    Memo array is not initialized to -1 to detect uncalculated values -> Option A
  5. Quick Check:

    Use -1 to mark uncalculated memo entries [OK]
Hint: Initialize memo with -1 to detect uncalculated values [OK]
Common Mistakes:
  • Assuming zero means uncalculated without initialization
  • Changing base case incorrectly
  • Thinking recursion must be replaced by iteration
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 stores intermediate results to avoid repeated calculations?
hard
A. Use a global variable to count calls without storing results
B. Recalculate all values each time without storing
C. Use a linked list to store all previous results dynamically
D. Use an array int memo[n+1] initialized with -1, store results at memo[i] for steps i

Solution

  1. Step 1: Understand problem and memoization need

    Number of ways to climb stairs is a classic recursion problem with overlapping subproblems.
  2. Step 2: Choose correct memoization method

    Using an array sized n+1 initialized with -1 allows storing results for each step count to reuse.
  3. Final Answer:

    Use an array int memo[n+1] initialized with -1, store results at memo[i] for steps i -> Option D
  4. Quick Check:

    Array memo with -1 initialization stores intermediate results [OK]
Hint: Use array memo[n+1] with -1 to store step results [OK]
Common Mistakes:
  • Not initializing memo array properly
  • Using global counters without memoization
  • Using complex data structures unnecessarily
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