Step 1: Call fib(5), check memo: empty, so compute fib(4) and fib(3)
memo: [null, null, null, null, null, null]
Why: We need fib(5), but no stored answer yet
Step 2: Call fib(4), check memo: empty, so compute fib(3) and fib(2)
memo: [null, null, null, null, null, null]
Why: fib(4) depends on fib(3) and fib(2)
Step 3: Call fib(3), check memo: empty, so compute fib(2) and fib(1)
memo: [null, null, null, null, null, null]
Why: fib(3) depends on fib(2) and fib(1)
Step 4: Call fib(2), check memo: empty, so compute fib(1) and fib(0)
memo: [null, null, null, null, null, null]
Why: fib(2) depends on fib(1) and fib(0)
Step 5: fib(1) and fib(0) are base cases, return 1 and 0 respectively, store in memo
memo: [0, 1, null, null, null, null]
Why: Base cases have known answers
Step 6: Calculate fib(2) = fib(1) + fib(0) = 1 + 0 = 1, store in memo
memo: [0, 1, 1, null, null, null]
Why: Store result to avoid recomputation
Step 7: Calculate fib(3) = fib(2) + fib(1) = 1 + 1 = 2, store in memo
memo: [0, 1, 1, 2, null, null]
Why: Use stored fib(2) and fib(1) to get fib(3)
Step 8: Calculate fib(4) = fib(3) + fib(2) = 2 + 1 = 3, store in memo
memo: [0, 1, 1, 2, 3, null]
Why: Use stored fib(3) and fib(2) to get fib(4)
Step 9: Calculate fib(5) = fib(4) + fib(3) = 3 + 2 = 5, store in memo
memo: [0, 1, 1, 2, 3, 5]
Why: Use stored fib(4) and fib(3) to get fib(5)
Result: memo: [0, 1, 1, 2, 3, 5]
Answer: 5