Lecture 9 - Object Oriented Programming
Lecture 9 - Object Oriented Programming
Programming
Lecture 9: Recursion
Introduction to Recursion
• A recursive function is a function that calls itself.
• Recursive functions can be useful in solving
problems that can be broken down into smaller or
simpler subproblems of the same type. A base
case should eventually be reached, at which time
the breaking down (recursion) will stop.
14-2
Recursive Functions
Consider a function for solving the count-down
problem from some number num down to 0:
• The base case is when num is already 0: the problem
is solved and we “blast off!”
• If num is greater than 0, we count off num and then
recursively count down from num-1
14-3
Recursive Functions
A recursive function for counting down to 0:
void countDown(int num)
{
if (num == 0)
cout << "Blastoff!";
else
{
cout << num << ". . .";
countDown(num-1); // recursive
} // call
}
14-4
What Happens When Called?
If a program contains a line like countDown(2);
1. countDown(2) generates the output 2..., then it
calls countDown(1)
2. countDown(1) generates the output 1..., then it
calls countDown(0)
3. countDown(0) generates the output Blastoff!,
then returns to countDown(1)
4. countDown(1) returns to countDown(2)
5. countDown(2)returns to the calling function
14-5
What Happens When Called?
first call to
countDown OUTPUT:
num is 2
2...
countDown(1);
second call to
countDown
num is 1
countDown(0); 1...
third call to
countDown
num is 0
// no Blastoff!
// recursive
// call
14-6
Stopping the Recursion
14-7
Stopping the Recursion
void countDown(int num)
{
if (num == 0) // test
cout << "Blastoff!";
else
{
cout << num << "...\n";
countDown(num-1); // recursive
} // call
}
14-8
Stopping the Recursion
• With each recursive call, the parameter controlling the
recursion should move closer to the base case
• Eventually, the parameter reaches the base case and
the chain of recursive calls terminates
14-9
Stopping the Recursion
void countDown(int num)
{
if (num == 0) // base case
cout << "Blastoff!";
else
{ cout << num << "...\n";
countDown(num-1);
} Value passed to recursive call
} is closer to base case of num =
0.
14-10
What Happens When Called?
• Each time a recursive function is called, a new copy
of the function runs, with new instances of
parameters and local variables being created
• As each copy finishes executing, it returns to the
copy of the function that called it
• When the initial copy finishes executing, it returns
to the part of the program that made the initial call
to the function
14-11
Types of Recursion
• Direct recursion
• a function calls itself
• Indirect recursion
• function A calls function B, and function B calls function A. Or,
• function A calls function B, which calls …, which calls function A
14-12
Recursive Function
#include <iostream>
using namespace std;
void message(int);
int main()
{ message(5); message called with 5 in times.
// greater than 0, the message is displayed and the function * message called with 2 in times.
{ cout << "message called with " << times message returning with 0 in times.
14-14
Recursive Factorial Function
• Factorial of n can be expressed in terms of the factorial of n-
1
0!=1
n ! = n x (n-1) !
• The base case is n = 0
• Recursive function
int factorial(int n)
{ if (n == 0) return 1;
else
return n *factorial(n-1);
}
14-15
Character Count by Recursion
// This program demonstrates a recursive
function for counting
// the number of times a character appears in int numChars(char search, char str[], int subscript)
a string.
{
#include <iostream>
using namespace std; if (str[subscript] == '\0')
{
// Function prototype // Base case: The end of the string is reached.
int numChars(char, char [], int);
return 0;
}
int main()
else if (str[subscript] == search)
{
char array[] = "abcddddef"; {
return 0; else
} {
14-17
Recursive Fibonacci Function
int fib(int n)
{
if (n <= 0) // base case
return 0;
else if (n = = 1) // base case
return 1;
else
return fib(n – 1) + fib(n – 2);
}
14-18
14.5 A Recursive Binary Search Function
14-19
Recursive Binary Search
A recursive strategy for searching a portion of the array from index lo
to index hi is to
set m to index of the middle portion of array:
lo m hi
14-20
Recursive Binary Search
lo m hi
14-21
Non-Recursive Binary Search Function
int binarySearch(int array[], int numelems, int value)
{
int first = 0, // First array element
last = numelems - 1, // Last array element
middle, // Mid point of search
position = -1; // Position of search value
bool found = false; // Flag
while (!found && first <= last)
{ middle = (first + last) / 2; // Calculate mid point
if (array[middle] == value) // If value is found at mid
{ found = true;
position = middle;
}
else if (array[middle] > value) // If value is in lower half
last = middle - 1;
else
first = middle + 1; // If value is in upper half
}
return position;
}
Recursion
22
Recursive Binary Search
int bSearch(int a[],int lo,int hi,int X)
{
int m = (lo + hi) /2;
if(lo > hi) return -1; // base
if(a[m] == X) return m; // base
if(a[m] > X)
return bsearch(a,lo,m-1,X);
else
return bsearch(a,m+1,hi,X);
}
14-23
14.8 Recursion vs. Iteration
• Benefits (+), disadvantages(-) for recursion:
+ Natural formulation of solution to certain problems
+ Results in shorter, simpler functions
• May not execute very efficiently
• Benefits (+), disadvantages(-) for iteration:
+ Executes more efficiently than recursion
• May not be as natural as recursion for some problems
14-24