intermediate

Recursion & Scope Rules

7 min readLast updated: 2026-07-12

Overview

Recursion happens when a function calls itself to break down problems into smaller steps.

Learning Objectives

  • Define recursion base cases and recursive steps.
  • Prevent recursion stack overflow errors.
  • Use nonlocal declarations to update variables in nested closures.

Concept Explanation

A recursive function calls itself to solve sub-problems. It requires a base case to terminate execution. Nested functions searching for variables in enclosing functions require using nonlocal to modify them.

Code Examples

Example 1 — Basics

This example introduces the fundamental syntax and concepts.

python
def countdown(n):
    if n <= 0: return
    print(n)
    countdown(n - 1)

Example 2 — Everyday Usage

This example demonstrates a realistic scenario handling business parameters.

python
# Sum values of nested list structures
def list_sum(items):
    total = 0
    for item in items:
        if isinstance(item, list):
            total += list_sum(item) # Recursive call
        else:
            total += item
    return total

print(list_sum([1, [2, 3], 4]))

Example 3 — Advanced Example

This example shows clean, production-grade code structure following senior development standards.

python
# Nested tracker counter closure using nonlocal variable binding
def create_tracker():
    count = 0
    def track():
        nonlocal count
        count += 1
        return count
    return track

tracker = create_tracker()
print(tracker(), tracker())

Visual Flow

The following execution flow represents the step-by-step evaluation inside the interpreter:

text
Invoke function → Recursive step checks base case → Call next step → Base case matched → Return results up the stack

Common Mistakes

Review these common pitfalls when working with this topic:

  • Forgetting base cases, causing RecursionError (stack overflow).
  • Using recursion where a simple linear loop would consume less memory.
  • Confusing the nonlocal scope modifier with the global keyword.
  • Modifying global variables recursively without safe wrappers.

Best Practices

Enforce these Pythonic best practices in your codebase:

❌ Don't
python
def sum_nums(n):
    if n == 1: return 1
    return n + sum_nums(n-1) # Stack overflow if n is large
✅ Do
python
def sum_nums(n):
    return sum(range(1, n + 1)) # Fast built-in math function

Quick Revision

Use these key summaries for last-minute revision:

  • Recursive functions call themselves.
  • Base cases prevent infinite recursion loops.
  • Python does not optimize tail-end recursion calls.
  • Default recursion depth is limited to 1000 frames.
  • nonlocal updates variables in enclosing scopes.