Step 1: Call fib(5), check memo, not found, so compute fib(4) and fib(3)
memo: [null, null, null, null, null, null]
fib calls stack: fib(5) -> fib(4), fib(3)
Why: We start with the big problem and break it down
Step 2: Call fib(4), check memo, not found, compute fib(3) and fib(2)
memo: [null, null, null, null, null, null]
fib calls stack: fib(5) -> fib(4) -> fib(3), fib(2)
Why: Keep breaking down until base cases
Step 3: Call fib(3), check memo, not found, compute fib(2) and fib(1)
memo: [null, null, null, null, null, null]
fib calls stack: fib(5) -> fib(4) -> fib(3) -> fib(2), fib(1)
Why: Breaking down further
Step 4: Call fib(2), check memo, not found, compute fib(1) and fib(0)
memo: [null, null, null, null, null, null]
fib calls stack: fib(5) -> fib(4) -> fib(3) -> fib(2) -> fib(1), fib(0)
Step 5: fib(1) and fib(0) are base cases, return 1 and 0
memo: [null, null, 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: [null, null, 1, null, null, null]
Why: Save answer to avoid recomputation
Step 7: fib(1) is base case, return 1
memo unchanged
Step 8: Calculate fib(3) = fib(2) + fib(1) = 1 + 1 = 2, store in memo
memo: [null, null, 1, 2, null, null]
Why: Save answer for fib(3)
Step 9: Call fib(2), found in memo as 1, return 1
memo unchanged
Step 10: Calculate fib(4) = fib(3) + fib(2) = 2 + 1 = 3, store in memo
memo: [null, null, 1, 2, 3, null]
Why: Save answer for fib(4)
Step 11: Call fib(3), found in memo as 2, return 2
memo unchanged
Step 12: Calculate fib(5) = fib(4) + fib(3) = 3 + 2 = 5, store in memo
memo: [null, null, 1, 2, 3, 5]
Why: Save answer for fib(5)
Result: memo: [null, null, 1, 2, 3, 5]
Answer: 5