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
#include 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: Factorial 1! = 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 1 n!=n*(n-1)! if n >1
21 Example : #include 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 factorial unsigned 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! = ! = ! = ! =
Factorial(3) unsigned long Factorial( unsigned long number ){ A1 if (number < 1) // base case A2 return 1; A3 else // recursive case A4 return number * Factorial( number - 1 ); A5} 22 3 A0 3 2 A4 3 A0 2 A4 1 3 A0 2 A A0 2 A A0 2 2 A4 6 3 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 pHead
Recursion - Print List Algorithm Print(val head ) 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 AddrValue AddrValue pHead Create List Print(pHead)
31 AddrValue AddrValue pHead head 204A0retAdd 6 output
32 AddrValue AddrValue pHead head 204A0retAdd head 224A4retAdd 6 10 output
33 AddrValue AddrValue pHead head 204A0retAdd head 224A4retAdd head 234A4retAdd output
34 AddrValue AddrValue pHead head 204A0retAdd head 224A4retAdd head 234A4retAdd head 244A4retAdd output
35 AddrValue AddrValue pHead head 204A0retAdd head 224A4retAdd head 234A4retAdd head 244A4retAdd 2500head 254A4retAdd output
36 AddrValue AddrValue pHead head 204A0retAdd head 224A4retAdd head 234A4retAdd head 244A4retAdd output
37 AddrValue AddrValue pHead head 204A0retAdd head 224A4retAdd head 234A4retAdd output
38 AddrValue AddrValue pHead head 204A0retAdd head 224A4retAdd output
39 AddrValue AddrValue pHead head 204A0retAdd output
40 AddrValue AddrValue pHead 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! 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! No termination condition 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 problem bool 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