Step 1: Call fib(5), cache empty
Cache: {}
Call stack: fib(5)Why: Start calculation for fib(5)
Step 2: Call fib(4) from fib(5), cache still empty
Cache: {}
Call stack: fib(5) -> fib(4)Why: Need fib(4) to compute fib(5)
Step 3: Call fib(3) from fib(4), cache still empty
Cache: {}
Call stack: fib(5) -> fib(4) -> fib(3)Why: Need fib(3) to compute fib(4)
Step 4: Call fib(2) from fib(3), cache still empty
Cache: {}
Call stack: fib(5) -> fib(4) -> fib(3) -> fib(2)Why: Need fib(2) to compute fib(3)
Step 5: fib(2) base case returns 1, store in cache
Cache: {2:1}
Call stack: fib(5) -> fib(4) -> fib(3)Why: fib(2) known, save result
Step 6: Call fib(1) from fib(3), base case returns 1, store in cache
Cache: {2:1, 1:1}
Call stack: fib(5) -> fib(4) -> fib(3)Why: fib(1) known, save result
Step 7: Calculate fib(3) = fib(2) + fib(1) = 1 + 1 = 2, store in cache
Cache: {2:1, 1:1, 3:2}
Call stack: fib(5) -> fib(4)Why: fib(3) computed and saved
Step 8: Call fib(2) from fib(4), found in cache as 1
Cache: {2:1, 1:1, 3:2}
Call stack: fib(5) -> fib(4)Why: Reuse cached fib(2) to avoid recomputation
Step 9: Calculate fib(4) = fib(3) + fib(2) = 2 + 1 = 3, store in cache
Cache: {2:1, 1:1, 3:2, 4:3}
Call stack: fib(5)Why: fib(4) computed and saved
Step 10: Call fib(3) from fib(5), found in cache as 2
Cache: {2:1, 1:1, 3:2, 4:3}
Call stack: fib(5)Why: Reuse cached fib(3) to avoid recomputation
Step 11: Calculate fib(5) = fib(4) + fib(3) = 3 + 2 = 5, store in cache
Cache: {2:1, 1:1, 3:2, 4:3, 5:5}
Call stack: emptyWhy: fib(5) computed and saved, recursion ends
Result: Cache: {1:1, 2:1, 3:2, 4:3, 5:5}
Answer: 5