790 likes | 896 Views
Chapter 1. RECURSION. 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
E N D
Chapter 1 RECURSION
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
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; }
Function implementation d1 = maximum (a, b, c); // a = 7; b = 9; c = 8 A4 Return Address Return value int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max; } 7 x 9 y 8 z max
Function implementation d1 = maximum (a, b, c); // a = 7; b = 9; c = 8 A4 Return Address Return value int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max; } 7 x 9 y 8 z 7 max
Function implementation d1 = maximum (a, b, c); // a = 7; b = 9; c = 8 A4 Return Address Return value int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max; } 7 x 9 y 8 z 9 max
Function implementation d1 = maximum (a, b, c); // a = 7; b = 9; c = 8 A4 Return Address Return value int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max; } 7 x 9 y 8 z 9 max
Function implementation d1 = maximum (a, b, c); // a = 7; b = 9; c = 8 A4 Return Address 9 Return value int maximum( int x, int y, int z) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; return max; } 7 x 9 y 8 z 9 max
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.
Recursion • An object contains itself
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.
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
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 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! = 5040 8! = 40320 9! = 362880 10! = 3628800
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} A4 0 1 A4 A4 A4 1 1 1 1 1 A4 A4 A4 A4 A4 2 2 2 2 2 2 A0 A0 A0 A0 A0 A0 A0 3 3 3 3 3 3 3 6
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
Recursion - Print List pTemp = pHead;
Recursion - Print List • A list is • empty, or • consists of an element and a sublist, where sublistis a list. pHead pHead
Recursion - Print List Algorithm 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
Recursion - Print List Create List Print(pHead)
output 6
output 6 10
output 6 10 14
output 6 10 14 20
output 6 10 14 20
output 6 10 14 20
output 6 10 14 20
output 6 10 14 20
output 6 10 14 20
output 6 10 14 20