Understanding Recursion: Solving Problems by Calling Yourself

Recursion is a powerful concept in programming where a function calls itself to break a complex problem into smaller, more manageable parts. It is often used in mathematical computations, problem-solving, and algorithms like sorting and searching.

In this post, we’ll explore how recursion works, common examples, and how to avoid infinite recursion using Python and JavaScript.


What is Recursion?

A function is recursive if it calls itself within its own definition. Recursion is commonly used to solve problems that can be broken into similar subproblems.

Key Components of Recursion

  1. Base Case (Terminating Condition) – A condition that stops the recursion to prevent infinite loops.
  2. Recursive Case – The function calls itself with a smaller problem.

Think of recursion like a set of Russian dolls—each doll contains a smaller version of itself until you reach the smallest doll.


Example 1: Calculating Factorials

The factorial of a number (n!) is the product of all positive integers up to n:

5! = 5 × 4 × 3 × 2 × 1 = 120

Python Implementation

def factorial(n):
    if n == 0 or n == 1:  # Base case
        return 1
    return n * factorial(n - 1)  # Recursive case

print(factorial(5))  # Output: 120

JavaScript Implementation

function factorial(n) {
  if (n === 0 || n === 1) {
    // Base case
    return 1;
  }
  return n * factorial(n - 1); // Recursive case
}

console.log(factorial(5)); // Output: 120

Here, factorial(5) calls factorial(4), which calls factorial(3), and so on, until it reaches factorial(1), which stops the recursion.


Avoiding Infinite Recursion

If we forget the base case, the function will keep calling itself indefinitely, leading to a stack overflow error.

Example of Infinite Recursion (DON’T RUN THIS CODE)

def infinite_loop(n):
    return infinite_loop(n - 1)  # No base case!

To avoid infinite recursion, always define a clear base case before making recursive calls.


Example 2: Fibonacci Sequence

The Fibonacci sequence is a series where each number is the sum of the two preceding ones:

0, 1, 1, 2, 3, 5, 8, 13...

Python Implementation

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(6))  # Output: 8

JavaScript Implementation

function fibonacci(n) {
  if (n <= 0) return 0;
  if (n === 1) return 1;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

console.log(fibonacci(6)); // Output: 8

While this works, it is inefficient for large numbers due to repeated calculations. Using memoization can help optimize it.


Example 3: Tower of Hanoi Puzzle

The Tower of Hanoi is a classic problem where three rods and multiple disks must be moved following these rules:

  • Only one disk moves at a time.
  • A disk can only be placed on top of a larger disk.
  • All disks start on the first rod and must be moved to the last rod.

Python Implementation

def tower_of_hanoi(n, source, auxiliary, target):
    if n == 1:
        print(f"Move disk 1 from {source} to {target}")
        return
    tower_of_hanoi(n - 1, source, target, auxiliary)
    print(f"Move disk {n} from {source} to {target}")
    tower_of_hanoi(n - 1, auxiliary, source, target)

tower_of_hanoi(3, 'A', 'B', 'C')

Output:

Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C

This problem demonstrates breaking a problem into smaller subproblems recursively.


Summary: Writing Recursive Functions

To write a recursive function:

  1. Define the base case first – The condition where the function stops calling itself.
  2. Write the recursive case – Define how the problem breaks into smaller parts.
  3. Ensure each step moves toward the base case to prevent infinite recursion.

Fun Recursive Math Problems

Try solving these using recursion:

  1. Sum of digits: Given a number n, return the sum of its digits.
  2. Reverse a string: Recursively reverse a given string.
  3. Greatest Common Divisor (GCD): Use recursion to find the GCD of two numbers.

Example (Sum of Digits in Python):

def sum_of_digits(n):
    if n == 0:
        return 0
    return n % 10 + sum_of_digits(n // 10)

print(sum_of_digits(1234))  # Output: 10 (1+2+3+4)

Final Thoughts

Recursion is a powerful problem-solving technique, but it requires careful handling to avoid infinite loops. By practicing with problems like factorials, Fibonacci, and puzzles like Tower of Hanoi, you’ll develop a strong intuition for recursive thinking.

What recursive problems have you solved? Share your thoughts in the comments!

Happy coding!