Step 1: Call fib(4), memo is empty
fib(4) -> memo: {}Why: Start computing fib(4), no answers saved yet
Step 2: Call fib(3) inside fib(4), memo still empty
fib(4) -> fib(3) -> memo: {}Why: Need fib(3) to compute fib(4)
Step 3: Call fib(2) inside fib(3), memo still empty
fib(4) -> fib(3) -> fib(2) -> memo: {}Why: Need fib(2) to compute fib(3)
Step 4: Call fib(1) inside fib(2), base case returns 1, store in memo
fib(4) -> fib(3) -> fib(2) -> fib(1)=1 -> memo: {1=1}Why: fib(1) is base case, save result
Step 5: Call fib(0) inside fib(2), base case returns 0, store in memo
fib(4) -> fib(3) -> fib(2) -> fib(0)=0 -> memo: {1=1, 0=0}Why: fib(0) is base case, save result
Step 6: Calculate fib(2) = fib(1) + fib(0) = 1 + 0 = 1, store in memo
fib(4) -> fib(3) -> fib(2)=1 -> memo: {1=1, 0=0, 2=1}Why: fib(2) computed and saved to avoid recomputation
Step 7: Call fib(1) inside fib(3), found in memo as 1, reuse it
fib(4) -> fib(3) -> fib(1)=1 (from memo) -> memo: {1=1, 0=0, 2=1}Why: Reuse saved fib(1) to save time
Step 8: Calculate fib(3) = fib(2) + fib(1) = 1 + 1 = 2, store in memo
fib(4) -> fib(3)=2 -> memo: {1=1, 0=0, 2=1, 3=2}Why: fib(3) computed and saved
Step 9: Call fib(2) inside fib(4), found in memo as 1, reuse it
fib(4) -> fib(2)=1 (from memo) -> memo: {1=1, 0=0, 2=1, 3=2}Why: Reuse saved fib(2) to save time
Step 10: Calculate fib(4) = fib(3) + fib(2) = 2 + 1 = 3, store in memo
fib(4)=3 -> memo: {1=1, 0=0, 2=1, 3=2, 4=3}Why: fib(4) computed and saved
Result: fib(4)=3 -> memo: {0=0,1=1,2=1,3=2,4=3}