Step 1: Call fib(5), no memo yet
memo = {}
Call stack: fib(5)Why: Start solving the big problem
Step 2: Call fib(4) inside fib(5), no memo for 4
memo = {}
Call stack: fib(5) -> fib(4)Why: Need fib(4) to find fib(5)
Step 3: Call fib(3) inside fib(4), no memo for 3
memo = {}
Call stack: fib(5) -> fib(4) -> fib(3)Why: Need fib(3) to find fib(4)
Step 4: Call fib(2) inside fib(3), no memo for 2
memo = {}
Call stack: fib(5) -> fib(4) -> fib(3) -> fib(2)Why: Need fib(2) to find fib(3)
Step 5: Call fib(1) inside fib(2), base case returns 1
memo = {}
Call stack: fib(5) -> fib(4) -> fib(3) -> fib(2) -> fib(1)Step 6: Call fib(0) inside fib(2), base case returns 0
memo = {}
Call stack: fib(5) -> fib(4) -> fib(3) -> fib(2) -> fib(0)Step 7: Calculate fib(2) = fib(1)+fib(0) = 1+0=1, store in memo
memo = {2:1}
Call stack: fib(5) -> fib(4) -> fib(3)Why: Save result to avoid future recalculation
Step 8: Call fib(1) inside fib(3), base case returns 1
memo = {2:1}
Call stack: fib(5) -> fib(4) -> fib(3) -> fib(1)Step 9: Calculate fib(3) = fib(2)+fib(1) = 1+1=2, store in memo
memo = {2:1, 3:2}
Call stack: fib(5) -> fib(4)Step 10: Call fib(2) inside fib(4), found in memo as 1
memo = {2:1, 3:2}
Call stack: fib(5) -> fib(4) -> fib(2)Step 11: Calculate fib(4) = fib(3)+fib(2) = 2+1=3, store in memo
memo = {2:1, 3:2, 4:3}
Call stack: fib(5)Step 12: Call fib(3) inside fib(5), found in memo as 2
memo = {2:1, 3:2, 4:3}
Call stack: fib(5) -> fib(3)Step 13: Calculate fib(5) = fib(4)+fib(3) = 3+2=5, store in memo
memo = {2:1, 3:2, 4:3, 5:5}
Call stack: emptyResult: memo = {2:1, 3:2, 4:3, 5:5}
Answer: 5