Recursion is the process of repeating items in a self-similar way. Any function which calls itself is called recursive. A recursive method solves a problem by calling a copy of itself to work on a smaller problem. This is called the recursion step. Recursion is a useful technique borrowed from mathematics. Recursive code is generally shorter & easier to write than iterative code. For example, sort, search & traversal problems often have simple recursive solutions.
Before diving into the sea, we all have to understand 2 statements -
A recursive function performs a task in part by calling itself to perform the subtasks. So, at some point, the function encounters a subtask that it can perform without calling itself.
- Base Case: This case, where the function doesn’t recur, is called the Base case.
- Cursive Case: The function calls itself to perform a subtask and is referred to as the Cursive case.
For example, consider the factorial function: n! is the product of all integers between n and 1. The definition of recursive factorial looks like this:
n! = 1, (if n = 0)
n! = n * (n-1)! (If n>0)
In the recursive case, when n is greater than 1, the function calls itself to determine the value of (n –1)! and multiplies that with n. In the base case, when n is 0 or 1, the function simply returns 1.
Recursion Vs. Iteration
The main inspiration comes to my mind before writing this blog is, which way is better? — Iteration or Recursion. From my point of view, the answer to this question depends on what we are trying to solve. A recursive approach mirrors the problem that we are trying to solve. A recursive approach mat makes it simpler to solve a problem but adds overhead for each recursive call.
- Terminates when a base case is reached.
- Each recursive call requires extra space on the stack frame (memory).
- If we get infinite recursion, the program may run out of memory and result in a stack overflow.
- Solutions to some problems are easier to formulate recursively.
- Terminates when a condition is proven to be false.
- Each iteration does not require any extra space.
- An infinite loop could loop forever since there is no extra memory being created.
- Iterative solutions to a problem may not always be as obvious as a recursive solution.
Before compiling the whole discussion there are some points worth mentioning:
- Recursive algorithms have two types of cases, recursive cases, & base cases.
- Every recursive function case must terminate at a base case.
- Generally, iterative solutions are more efficient than recursive solutions
- A recursive algorithm can be implemented without recursive function calls using a stack, but it’s usually more trouble than it’s worth. That means any problem that can be solved recursively can also be solved iteratively.
- Some problems are best suited for recursive solutions while others are not.