1 Chapter 1 RECURSION. 2 Chapter 1 Subprogram implementation Recursion Designing Recursive...

Post on 28-Dec-2015

229 views 0 download

Transcript of 1 Chapter 1 RECURSION. 2 Chapter 1 Subprogram implementation Recursion Designing Recursive...

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