Skip to main content

Section 9.1 Introduction to Recursion

An algorithm or function is considered recursive when it calls itself to perform a portion of its task. Recursion offers a way to solve complex problems using concise, easily understandable, and efficient programs. It involves breaking down a large problem into one or more sub-problems that have the same structure as the original problem but are simpler to solve. This process continues until the sub-problems become straightforward enough to be solved without further division. The final solution is then obtained by combining the solved components.
To ensure the success of a recursive approach, the recursive call to the function must operate on a smaller problem compared to the original one. Typically, a recursive algorithm consists of two parts:
  1. The base case, which handles a simple input that can be solved directly without further recursion.
  2. The recursive part, which includes one or more recursive calls to the algorithm. In each recursive call, the parameters should be closer to the base case than those in the original call.
Recursion doesn’t have a direct counterpart in everyday problem-solving, which can make it challenging to grasp initially. When first learning recursion, it’s common to focus on understanding the recursive process. However, when writing recursive functions, it’s best to shift the focus away from the inner workings of recursion and instead concentrate on the recursive call. Trust that the sub-problems will be handled correctly and focus on defining the base cases and how to combine the results of the sub-problems.
Recursion is primarily used as a tool to simplify algorithm design and description. It may not always yield the most efficient program since function calls involved in recursion tend to have higher overhead compared to other alternatives like using a while loop. However, recursive approaches generally provide reasonably efficient algorithms. If needed, the clear and recursive solution can be further optimized to achieve faster implementations.
When we solve a "big" problem recursively, we break it down into smaller versions of the problem and solve each of them. The solutions to these smaller problems are then used to solve the original "big" problem. Recursive problem-solving involves tackling the smaller versions in a similar manner.
For instance, let’s consider the task of summing values in an array. What sets apart summing the first 50 elements from summing the first 100 elements? We can use the same approach for both scenarios. In fact, we can even leverage the solution to the smaller problem (summing the first 50 elements) to help us solve the larger problem (summing the first 100 elements).
You have attempted of activities on this page.