Subtopic Notes
19.2 Recursion
19. Computational thinking and Problem-solving
19.2 Recursion
- A recursive function is one that calls itself during execution.
- It must have:
- A base case - the condition where recursion stops.
- A general (recursive) case - where the function calls itself with updated parameters
- Without a base case, recursion would continue indefinitely and cause a stack overflow
- In programming, recursion is defined just like a normal function, but the function includes a call to itself.
- Advantages:
- Simpler and cleaner code
- Ideal for structures like trees, graphs
- Easier to understand conceptually
- Reduces the need for extra variables or loops
- Disadvantages
- Higher memory usage
- Slower execution
- Risk of stack overflow
- Difficult to trace or debug
- What the Compiler Does with Recursive Code
- The compiler allocates a new memory frame on the call stack for each recursive call.
- Each frame stores:
- Function parameters
- Return address
- Local variables
- When the base case is reached, the compiler returns values and removes frames one by one - this is known as stack unwinding
- Stacks and Unwinding
- Each recursive call is pushed onto the stack.
- When a call completes, it is popped off the stack.
- This process continues until the first (initial) call is completed.
- The stack structure ensures that functions return in the reverse order of their calls: Last In, First Out (LIFO).
- Tracing Recursive Algorithms
- Tracing involves following the sequence of function calls until the base case is reached.
- Each recursive call is placed on the call stack
- Once the base case is reached, the program unwinds the stack, returning values step by step.
Examples of Recursion
| Code | Tracing |
|---|---|
def factorial(n): if n == 0: # Base case return 1 else: # Recursive case return n * factorial(n - 1) | factorial(3) → 3 * factorial(2) → 2 * factorial(1) → 1 * factorial(0) → returns 1 |
def sum_n(n): if n == 1: # Base case return 1 else: # Recursive case return n + sum_n(n - 1) print(sum_n(5)) | sum_n(5) → 5 + sum_n(4) → 4 + sum_n(3) → 3 + sum_n(2) → 2 + sum_n(1) → returns 1 |
