Transcript Chapter 1

Chapter 6
Recursion
Data Structures Using C++
1
Chapter Objectives
• Learn about recursive definitions
• Explore the base case and the general case of a
recursive definition
• Discover recursive algorithms
• Learn about recursive functions
• Explore how to use recursive functions to
implement recursive algorithms
• Learn about recursion and backtracking
Data Structures Using C++
2
Recursive Definitions
• Recursion
– Process of solving a problem by reducing it to
smaller versions of itself
• Recursive definition
– Definition in which a problem is expressed in
terms of a smaller version of itself
– Has one or more base cases
Data Structures Using C++
3
Recursive Definitions
• Recursive algorithm
– Algorithm that finds the solution to a given problem by
reducing the problem to smaller versions of itself
– Has one or more base cases
– Implemented using recursive functions
• Recursive function
– function that calls itself
• Base case
– Case in recursive definition in which the solution is
obtained directly
– Stops the recursion
Data Structures Using C++
4
Recursive Definitions
• General solution
– Breaks problem into smaller versions of itself
• General case
– Case in recursive definition in which a smaller
version of itself is called
– Must eventually be reduced to a base case
Data Structures Using C++
5
Tracing a Recursive Function
Recursive function
– Has unlimited copies of itself
– Every recursive call has
• its own code
• own set of parameters
• own set of local variables
Data Structures Using C++
6
Tracing a Recursive Function
After completing recursive call:
• Control goes back to calling environment
• Recursive call must execute completely before
control goes back to previous call
• Execution in previous call begins from point
immediately following recursive call
Data Structures Using C++
7
Recursive Definitions
• Directly recursive: a function that calls itself
• Indirectly recursive: a function that calls another
function and eventually results in the original
function call
• Tail recursive function: recursive function in
which the last statement executed is the recursive
call
• Infinite recursion: the case where every recursive
call results in another recursive call
Data Structures Using C++
8
Designing Recursive Functions
• Understand problem requirements
• Determine limiting conditions
• Identify base cases
Data Structures Using C++
9
Designing Recursive Functions
• Provide direct solution to each base case
• Identify general case(s)
• Provide solutions to general cases in terms
of smaller versions of itself
Data Structures Using C++
10
Recursive Factorial Function
int fact(int
{
if(num ==
return
else
return
}
num)
0)
1;
num * fact(num – 1);
Data Structures Using C++
11
Recursive Factorial Trace
Data Structures Using C++
12
Recursive Implementation:
Largest Value in Array
int largest(const int list[], int lowerIndex, int upperIndex)
{
int max;
if(lowerIndex == upperIndex)
//the size of the sublist is 1
return list[lowerIndex];
else
{
max = largest(list, lowerIndex + 1, upperIndex);
if(list[lowerIndex] >= max)
return list[lowerIndex];
else
return max;
}
}
Data Structures Using C++
13
Execution of largest(list, 0, 3)
Data Structures Using C++
14
Recursive Fibonacci
int rFibNum(int a, int b, int n)
{
if(n == 1)
return a;
else if(n == 2)
return b;
else
return rFibNum(a, b, n - 1) + rFibNum(a, b, n - 2);
}
Data Structures Using C++
15
Execution of rFibonacci(2,3,5)
Data Structures Using C++
16
Towers of Hanoi Problem with
Three Disks
Data Structures Using C++
17
Towers of Hanoi: Three Disk
Solution
Data Structures Using C++
18
Towers of Hanoi: Three Disk
Solution
Data Structures Using C++
19
Towers of Hanoi: Recursive
Algorithm
void moveDisks(int count, int needle1, int needle3,
int needle2)
{
if(count > 0)
{
moveDisks(count - 1, needle1, needle2,
needle3);
cout<<"Move disk "<<count<<“ from "<<needle1
<<“ to "<<needle3<<"."<<endl;
moveDisks(count - 1, needle2, needle3,
needle1);
}
}
Data Structures Using C++
20
Decimal to Binary: Recursive
Algorithm
void decToBin(int num, int base)
{
if(num > 0)
{
decToBin(num/base, base);
cout<<num % base;
}
}
Data Structures Using C++
21
Execution of decToBin(13,2)
Data Structures Using C++
22
Recursion or Iteration?
• Two ways to solve particular problem
– Iteration
– Recursion
• Iterative control structures: uses looping to
repeat a set of statements
• Tradeoffs between two options
– Sometimes recursive solution is easier
– Recursive solution is often slower
Data Structures Using C++
23
Backtracking Algorithm
• Attempts to find solutions to a problem by
constructing partial solutions
• Makes sure that any partial solution does
not violate the problem requirements
• Tries to extend partial solution towards
completion
Data Structures Using C++
24
Backtracking Algorithm
• If it is determined that partial solution
would not lead to solution
– partial solution would end in dead end
– algorithm backs up by removing the most
recently added part and then tries other
possibilities
Data Structures Using C++
25
Solution to 8-Queens Puzzle
Data Structures Using C++
26
4-Queens Puzzle
Data Structures Using C++
27
4-Queens Tree
Data Structures Using C++
28
8 X 8 Square Board
Data Structures Using C++
29
Chapter Summary
•
•
•
•
•
Recursive definitions
Recursive algorithms
Recursive functions
Base cases
General cases
Data Structures Using C++
30
Chapter Summary
•
•
•
•
•
•
Tracing recursive functions
Designing recursive functions
Varieties of recursive functions
Recursion vs. Iteration
Backtracking
N-Queens puzzle
Data Structures Using C++
31