If these ideas are new, begin with:
Understand the idea
A recursion tree depicts every call and repeated subproblem. It helps count total work; the active call stack is only one root-to-leaf path. Repetition suggests memoization.
Work through an example
fib(5) includes fib(3) from both fib(4) and the second child fib(3). Caching by n prevents recomputing that entire subtree.
Time and space complexity
Naive Fibonacci O(2^n) upper bound; memoization reduces to O(n) states/time and O(n) storage.
Why it works
Nodes represent call instances; identical arguments may still appear at several nodes.
Common mistakes
- Do not infer time from depth alone.
- A branching tree may have exponentially many nodes.
Chapter lab · Python implementation
A recursive function solves a smaller instance of the same contract. The lab computes Fibonacci with deliberately naive recursion to expose repeated subproblems, then uses fast exponentiation as a shrinking recurrence. A Python call stack is finite; large depths require an iterative design rather than assuming unlimited recursion.
This shared lab connects the chapter's topics. Follow the current lesson's worked example first, then trace the complete implementation. Additional algorithms described in topic exercises are variations you can implement independently.
def fib(n):
if n<0:
raise ValueError('nonnegative n required')
if n<2:
return n
return fib(n-1)+fib(n-2)
def power(base,exponent):
if exponent<0:
raise ValueError('nonnegative exponent required')
if exponent==0:
return 1
half=power(base,exponent//2)
result=half*half
return result*base if exponent%2 else result
def fib_iter(n):
if n<0:
raise ValueError('nonnegative n required')
a,b=0,1
for _ in range(n):
a,b=b,a+b
return aRun and test the lab
Copy the implementation and these assertions into a Python 3 file and run it. An assertion failure means the actual result differs from the expectation. Add the current topic's exercise and boundary tests to deepen your understanding.
assert fib(6)==8 and fib(0)==0
assert all(fib(n)==fib_iter(n) for n in range(12))
assert power(3,5)==243 and power(9,0)==1
assert power(-2,3)==-8