Lect 25
Lect 25
Lect 25
Recursion: A way of defining a concept where the text of the definition refers to the concept that is being defined. In programming: A recursive procedure is a procedure which calls itself. Classic example: Here is the non-recursive definition of fhe factorial function: n! = 1 2 3 (n-1) n Here is the recursive definition of a factorial: (here f(n) = n!) Code of recursive procedures, in functional programming languages is almost identical to a recursive definition!
Recursion
Recursion is more than just a programming technique. It has two other uses in computer science and software engineering, namely: as a way of describing, defining, or specifying things. as a way of designing solutions to problems (divide and conquer).
Iterative Definition
In general, we can define the factorial function in the following way:
Iterative Definition
This is an iterative definition of the factorial function. It is iterative because the definition only contains the algorithm parameters and not the algorithm itself. This will be easier to see after defining the recursive implementation.
Recursive Definition
We can also define the factorial function in the following way:
if n=0 if n>0
if n=0 if n>0
Recursion
To see how the recursion works, let s break down the factorial function to solve factorial(3)
Breakdown
Here, we see that we start at the top level, factorial(3), and simplify the problem into 3 x factorial(2). Now, we have a slightly less complicated problem in factorial(2), and we simplify this problem into 2 x factorial(1).
Breakdown
We continue this process until we are able to reach a problem that has a known solution. In this case, that known solution is factorial(0) = 1. The functions then return in reverse order to complete the solution.
Breakdown
This known solution is called the base case. Every recursive algorithm must have a base case to simplify to. Otherwise, the algorithm would run forever (or until the computer ran out of memory).
Breakdown
The other parts of the algorithm, excluding the base case, are known as the general case. For example: 3 x factorial(2) general case 2 x factorial(1) general case etc
Breakdown
After looking at both iterative and recursive methods, it appears that the recursive method is much longer and more difficult. If that s the case, then why would we ever use recursion? It turns out that recursive techniques, although more complicated to solve by hand, are very simple and elegant to implement in a computer.
Iterative Algorithm
factorial(n) { i=1 factN = 1 loop (i <= n) factN = factN * i i=i+1 end loop return factN }
The iterative solution is very straightforward. We simply loop through all the integers between 1 and n and multiply them together.
Limitations of Recursion
Recursion is a powerful problem-solving technique that often produces very clean solutions to even the most complex problems. Recursive solutions can be easier to understand and to describe than iterative solutions.
Limitations of Recursion
By using recursion, you can often write simple, short implementations of your solution. However, just because an algorithm can be implemented in a recursive manner doesn t mean that it should be implemented in a recursive manner.
Limitations of Recursion
Recursion works the best when the algorithm and/or data structure that is used naturally supports recursion. One such data structure is the tree (more to come). One such algorithm is the binary search algorithm that we discussed earlier in the course.
Limitations of Recursion
Recursive solutions may involve extensive overhead because they use calls. When a call is made, it takes time to build a stackframe and push it onto the system stack. Conversely, when a return is executed, the stackframe must be popped from the stack and the local variables reset to their previous values this also takes time.
Limitations of Recursion
In general, recursive algorithms run slower than their iterative counterparts. Also, every time we make a call, we must use some of the memory resources to make room for the stackframe.
Limitations of Recursion
Therefore, if the recursion is deep, say, factorial(1000), we may run out of memory. Because of this, it is usually best to develop iterative algorithms when we are working with large numbers.