📖 Scenario: You are working on a program that calculates Fibonacci numbers. The Fibonacci sequence is a series where each number is the sum of the two before it, starting with 0 and 1.Calculating Fibonacci numbers using simple recursion can be slow because it repeats the same calculations many times. To make it faster, you will use memoization, which remembers the results of previous calculations.
🎯 Goal: Build a Java program that uses memoization to efficiently calculate Fibonacci numbers using recursion.
📋 What You'll Learn
Create a method to calculate Fibonacci numbers recursively.
Use a memoization technique with a HashMap to store and reuse results.
Print the Fibonacci number for a given input.
💡 Why This Matters
🌍 Real World
Memoization is used in many real-world applications like dynamic programming, caching results in web servers, and optimizing complex calculations in games and simulations.
💼 Career
Understanding memoization helps in writing efficient algorithms, which is a key skill for software developers, especially in roles involving algorithm design, performance optimization, and problem solving.
Progress0 / 4 steps
1
Create the Fibonacci method without memoization
Create a public static method called fib that takes an int n and returns the int Fibonacci number using simple recursion. Use the base cases: return 0 if n == 0, return 1 if n == 1. Otherwise, return fib(n - 1) + fib(n - 2).
DSA Java
Hint
Use simple recursion with two base cases for 0 and 1.
2
Add a HashMap for memoization
Add a private static HashMap<Integer, Integer> called memo to the Fibonacci class to store previously calculated Fibonacci numbers. Initialize it as a new HashMap<>().
DSA Java
Hint
Declare a static HashMap called memo to store results.
3
Modify fib method to use memoization
Modify the fib method to first check if memo contains the key n. If yes, return the stored value. Otherwise, compute the Fibonacci number recursively, store it in memo with key n, and then return it.
DSA Java
Hint
Use memo.containsKey(n) to check and memo.put(n, result) to store.
4
Print the Fibonacci number for n=10
Add a main method to the Fibonacci class. Inside it, call fib(10) and print the result using System.out.println.
DSA Java
Hint
Use public static void main(String[] args) and print fib(10).
Practice
(1/5)
1. What is the main purpose of using memoization in recursive functions?
easy
A. To store results of expensive function calls and reuse them
B. To make the code shorter and simpler
C. To avoid using loops in recursion
D. To increase the number of recursive calls
Solution
Step 1: Understand recursion inefficiency
Recursive functions often repeat the same calculations multiple times, which wastes time.
Step 2: Role of memoization
Memoization saves the results of these repeated calculations so they can be reused instead of recalculated.
Final Answer:
To store results of expensive function calls and reuse them -> Option A
Quick Check:
Memoization = Store and reuse results [OK]
Hint: Memoization saves repeated results to speed recursion [OK]
Common Mistakes:
Thinking memoization makes code shorter
Confusing memoization with iteration
Believing memoization increases recursion calls
2. Which of the following Java code snippets correctly declares a memoization cache for storing integer results by input integer keys?
easy
A. Map memo = new HashMap<>();
B. List<Integer> memo = new ArrayList<>();
C. int[] memo = new int();
D. HashSet<Integer> memo = new HashSet<>();
Solution
Step 1: Identify suitable data structure for key-value pairs
Memoization requires storing results by input keys, so a Map is ideal.
Step 2: Check Java syntax correctness
Map memo = new HashMap<>(); uses Map with HashMap, which is correct syntax for memoization cache.
Final Answer:
Map memo = new HashMap<>(); -> Option A
Quick Check:
Memo cache = Map for key-value pairs [OK]
Hint: Use Map for key-value memo cache in Java [OK]
Common Mistakes:
Using List instead of Map for memoization
Incorrect array declaration syntax
Using Set which stores only keys, no values
3. What will be the output of the following Java code using memoization for Fibonacci numbers?
import java.util.*;
public class FibMemo {
static Map memo = new HashMap<>();
public static int fib(int n) {
if (n <= 1) return n;
if (memo.containsKey(n)) return memo.get(n);
int result = fib(n-1) + fib(n-2);
memo.put(n, result);
return result;
}
public static void main(String[] args) {
System.out.println(fib(5));
}
}
medium
A. Error at runtime
B. 8
C. 5
D. 13
Solution
Step 1: Understand Fibonacci sequence calculation
fib(5) = fib(4) + fib(3), and so on, with base cases fib(0)=0, fib(1)=1.
Step 2: Calculate fib(5) with memoization
fib(2)=1, fib(3)=2, fib(4)=3, fib(5)=5. Memoization avoids repeated calls but result is same.
Final Answer:
5 -> Option C
Quick Check:
fib(5) = 5 [OK]
Hint: Recall Fibonacci(5) = 5, memoization doesn't change result [OK]
Common Mistakes:
Confusing Fibonacci values for wrong n
Assuming memoization changes output
Thinking code causes runtime error
4. Identify the error in this Java memoized factorial function:
import java.util.*;
public class FactorialMemo {
static Map memo = new HashMap<>();
public static int fact(int n) {
if (n == 0) return 1;
if (memo.containsKey(n)) return memo.get(n);
int result = n * fact(n - 1);
memo.put(n, result);
return result;
}
public static void main(String[] args) {
System.out.println(fact(-1));
}
}
medium
A. Memo map is not initialized properly
B. fact method should return long instead of int
C. Incorrect multiplication order in recursion
D. No base case for negative input causes infinite recursion
Solution
Step 1: Analyze base cases and input handling
Base case handles n == 0 only, but negative n causes no stop condition.
Step 2: Effect of negative input
Calling fact(-1) leads to infinite recursion because n never reaches 0 or memoized value.
Final Answer:
No base case for negative input causes infinite recursion -> Option D
Quick Check:
Missing negative base case = infinite recursion [OK]
Hint: Check base cases cover all input ranges [OK]
Common Mistakes:
Ignoring negative input handling
Assuming memo initialization error
Thinking multiplication order causes error
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 Java?
hard
A. Use a List<Integer> to store results; always calculate recursively without checking cache.
B. Use a Map to store results; check cache before recursive calls; store results after calculation.
C. Use an int array without initializing values; store results only after all recursion ends.
D. Use a Set<Integer> to store visited stairs; return size of set as result.
Solution
Step 1: Understand problem and memoization needs
We must store number of ways for each stair number to avoid repeated calculations.
Step 2: Evaluate memoization approaches
Use a Map to store results; check cache before recursive calls; store results after calculation. uses Map to store and check results before recursion, which is correct memoization practice.
Final Answer:
Use a Map to store results; check cache before recursive calls; store results after calculation. -> Option B
Quick Check:
Memo = Map with cache check and store [OK]
Hint: Check cache before recursion, store after calculation [OK]
Common Mistakes:
Not checking cache before recursive calls
Using List or Set incorrectly for memoization
Storing results too late or not at all
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.