| 1 | Call fib(4) | 4 | [None, None, None, None, None] | [None, None, None, None, None] | ? | fib(4) called, memo empty |
| 2 | Call fib(3) | 3 | [None, None, None, None, None] | [None, None, None, None, None] | ? | fib(3) called, memo empty |
| 3 | Call fib(2) | 2 | [None, None, None, None, None] | [None, None, None, None, None] | ? | fib(2) called, memo empty |
| 4 | Call fib(1) | 1 | [None, None, None, None, None] | [None, None, None, None, None] | 1 | fib(1) base case returns 1 |
| 5 | Call fib(0) | 0 | [None, None, None, None, None] | [None, None, None, None, None] | 0 | fib(0) base case returns 0 |
| 6 | Compute fib(2) | 2 | [None, None, None, None, None] | [None, None, Some(1), None, None] | 1 | fib(2) = 1 stored in memo[2] |
| 7 | Call fib(1) | 1 | [None, None, Some(1), None, None] | [None, None, Some(1), None, None] | 1 | fib(1) base case returns 1 |
| 8 | Compute fib(3) | 3 | [None, None, Some(1), None, None] | [None, None, Some(1), Some(2), None] | 2 | fib(3) = 2 stored in memo[3] |
| 9 | Call fib(2) | 2 | [None, None, Some(1), Some(2), None] | [None, None, Some(1), Some(2), None] | 1 | fib(2) memo hit returns 1 |
| 10 | Compute fib(4) | 4 | [None, None, Some(1), Some(2), None] | [None, None, Some(1), Some(2), Some(3)] | 3 | fib(4) = 3 stored in memo[4] |
| 11 | Return fib(4) | 4 | [None, None, Some(1), Some(2), Some(3)] | [None, None, Some(1), Some(2), Some(3)] | 3 | Final result returned |