1 chapter 1 recursion. 2 chapter 1 subprogram implementation recursion designing recursive...
Post on 28-Dec-2015
229 Views
Preview:
TRANSCRIPT
1
Chapter 1
RECURSION
2
Chapter 1
Subprogram implementation Recursion Designing Recursive Algorithms Towers of Hanoi Backtracking Eight Queens problem
Function implementation
Code segment (static part) Activation record (dynamic part)
Parameters Function result Local variables Return address
3
Function implementation
4
Function implementation#include <iostream.h>int maximum( int x, int y, int z) {
int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max;
}int main() {
int a, b, c, d1, d2;A1 cout << "Enter three integers: ";A2 cin >> a >> b >> c; A3 d1 = maximum (a, b, c); A4 cout << "Maximum is: " << d1 << endl;A5 d2 = maximum (7, 9, 8); A5 cout << "Maximum is: " << d2 << endl;A7 return 0;}
5
Function implementation
A4 Return Address
Return value
7
9
x
y
8 z
max
d1 = maximum (a, b, c); // a = 7; b = 9; c = 8
int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max;}
6
Function implementation
A4 Return Address
Return value
7
9
x
y
8 z
7 max
d1 = maximum (a, b, c); // a = 7; b = 9; c = 8
int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max;}
7
Function implementation
A4 Return Address
Return value
7
9
x
y
8 z
9 max
d1 = maximum (a, b, c); // a = 7; b = 9; c = 8
int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max;}
8
Function implementation
A4 Return Address
Return value
7
9
x
y
8 z
9 max
d1 = maximum (a, b, c); // a = 7; b = 9; c = 8
int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max;}
9
Function implementation
A4
9
Return Address
Return value
7
9
x
y
8 z
9 max
d1 = maximum (a, b, c); // a = 7; b = 9; c = 8
int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max;}
10
Function implementation
11
Function implementation
12
Function implementation
Stack frames: Each vertical column shows the contents of the stack
at a given time There is no difference between two cases:
when the temporary storage areas pushed on the stack come from different functions, and
when the temporary storage areas pushed on the stack come from repeated occurrences of the same function.
13
Recursion
An object contains itself
14
Recursion
15
Recursion
Recursion is the name for the case when: A function invokes itself, or A function invokes a sequence of other
functions, one of which eventually invokes the first function again.
In regard to stack frames for function calls, recursion is no different from any other function call. Stack frames illustrate the storage
requirements for recursion. Separate copies of the variables declared in
the function are created for each recursive call.
16
Recursion
17
Recursion
18
Recursion
19
20
Recursion In C++, it’s possible for a function to call itself. Functions that
do so are called seft-referential or recursive functions. In some problems, it may be natural to define the problem in
terms of the problem itself. Recursion is useful for problems that can be represented by a
simpler version of the same problem.
Example: Factorial1! = 1;
2! = 2*1 = 2*1!
3! = 3*2*1=3*2!
…. n! = n*(n-1)!
The factorial function is only defined for positive integers.
n!=1 if n is equal to 1n!=n*(n-1)! if n >1
21
Example :#include <iostream.h>
#include <iomanip.h>
unsigned long Factorial( unsigned long );
int main(){ for ( int i = 0; i <= 10; i++ ) cout << setw( 2 ) << i << "! = "
<< Factorial( i ) << endl; return 0;}// Recursive definition of function factorialunsigned long Factorial( unsigned long number ){ if (number < 1) // base case return 1; else // recursive case return number * Factorial( number - 1 );}
The output : 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 36288010! = 3628800
Factorial(3)unsigned long Factorial( unsigned long number ){A1 if (number < 1) // base caseA2 return 1;A3 else // recursive caseA4 return number * Factorial( number - 1 );A5}
22
3A0
3A0
2A4
3A0
2A4
1A4
3A0
2A411
A410
A4
3A0
2A411
A4
3A022
A4
63
A0
23
Recursion
We must always make sure that the recursion bottoms out: A recursive function must contain at least one non-
recursive branch. The recursive calls must eventually lead to a non-
recursive branch.
Recursion is one way to decompose a task into smaller subtasks. At least one of the subtasks is a smaller example of the same task. The smallest example of the same task has a non-recursive
solution.
Example: The factorial function
n! = n * (n-1)! and 1! = 1
24
25
Recursion - Print List
26
Recursion - Print List
27
pTemp = pHead;
Recursion - Print List A list is
empty, or consists of an element and a sublist, where
sublistis a list.
28
pHeadpHead
Recursion - Print ListAlgorithm Print(val head<pointer>)
Prints Singly Linked List.
Pre headpoints to the first element of the list needs to be printed.
Post Elements in the list have been printed.
Uses recursive function Print.
A1.if(head= NULL) // stopping case
A1.1.return
A2.write (head->data)
A3.Print(head->link) // recursive case
A4.End Print
29
Recursion - Print List
30
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
Create List
Print(pHead)
31
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
6
output
32
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
220 810 head
224 A4 retAdd
6 10
output
33
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
220 810 head
224 A4 retAdd
230 820 head
234 A4 retAdd
6 10 14
output
34
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
220 810 head
224 A4 retAdd
230 820 head
234 A4 retAdd
240 830 head
244 A4 retAdd
6 10 14 20
output
35
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
220 810 head
224 A4 retAdd
230 820 head
234 A4 retAdd
240 830 head
244 A4 retAdd
250 0 head
254 A4 retAdd
6 10 14 20
output
36
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
220 810 head
224 A4 retAdd
230 820 head
234 A4 retAdd
240 830 head
244 A4 retAdd
6 10 14 20
output
37
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
220 810 head
224 A4 retAdd
230 820 head
234 A4 retAdd
6 10 14 20
output
38
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
220 810 head
224 A4 retAdd
6 10 14 20
output
39
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead
200 800 head
204 A0 retAdd
6 10 14 20
output
40
Addr Value
800 6
804 810
810 10
814 820
820 14
824 830
830 20
834 0
Addr Value
100 800 pHead6 10 14 20
output
Recursion - Print List
41
Recursion - Print List
42
Designing Recursive Algorithms
43
Designing Recursive Algorithms
44
Designing Recursive Algorithms
45
Designing Recursive Algorithms
46
Designing Recursive Algorithms
47
Designing Recursive Algorithms
48
49
Designing Recursive Algorithms
50
51
Designing Recursive Algorithms
Price for recursion: calling a function consumes more time and memory than
adjusting a loop counter. high performance applications (graphic action games,
simulations of nuclear explosions) hardly ever use recursion.
In less demanding applications recursion is an attractive alternative for iteration
(for the right problems!)
52
Designing Recursive Algorithms
If we use iteration, we must be careful not to create an infinite loop by accident:
for(int incr=1; incr!=10;incr+=2) ...
int result = 1;while(result >0){ ... result++;} Oops!Oops!
Oops!Oops!
53
Designing Recursive Algorithms
Similarly, if we use recursion we must be careful not to create an infinite chain of function calls:
int fac(int numb){ return numb * fac(numb-1);}
Or: int fac(int numb){
if (numb<=1) return 1; else return numb * fac(numb+1);}
Oops!Oops!No termination No termination
conditioncondition
Oops!Oops!
54
Towers of Hanoi
Only one disc could be moved at a time A larger disc must never be stacked above a
smaller one One and only one extra needle could be used
for intermediate storage of discs
55
Towers of Hanoi
56
Towers of Hanoi
57
Towers of Hanoi
58
Towers of Hanoi
59
Towers of Hanoi
60
Towers of Hanoi
61
Towers of Hanoi
62
Backtracking
63
Backtracking
64
Backtracking – Eight Queens problem
65
Backtracking – Eight Queens problem
66
Backtracking – Eight Queens problem
67
Backtracking – Eight Queens problem
68
Backtracking – Eight Queens problem
69
Backtracking – Eight Queens problembool Queens::unguarded(int col) const{
int i;bool ok = true; for (i = 0; ok && i < count; i++) ok = !queen_square[i][col]; for (i = 1; ok && count - i >= 0 && col - i >= 0; i++) ok = !queen_square[count - i][col - i]; for (i = 1; ok && count - i >= 0 && col + i < board_size; i++) ok = !queen_square[count - i][col + i]; return ok;
}70
Backtracking – Eight Queens problem
71
Backtracking – Eight Queens problem
72
Backtracking – Eight Queens problem
73
Backtracking – Eight Queens problem
74
Backtracking – Eight Queens problem
75
Backtracking – Eight Queens problem
76
Backtracking – Eight Queens problem
77
Backtracking – Eight Queens problem
78
top related