outline function templates recursion example using ...assi/courses/mech... · function templates...

29
© 2003 Prentice Hall, Inc. All rights reserved. 1 Functions and Recursion Outline Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

Upload: others

Post on 12-Jun-2020

15 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

1

Functions and Recursion

Outline

Function TemplatesRecursionExample Using Recursion: The Fibonacci SeriesRecursion vs. Iteration

Page 2: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

2

Function Templates

• Compact way to make overloaded functions– Generate separate function for different data

types (instead of repeating the code)• Format

– Begin with keyword template– Formal type parameters in brackets <>

• Every type parameter preceded by typename or class (synonyms)

• Placeholders for built-in types (i.e., int) or user-defined types

• Specify arguments types, return types, declare variables

– Function definition like normal, except formal types used

Page 3: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

3

Function Templates

• Exampletemplate < class T > // or template< typename T >T square( T value1 ){

return value1 * value1;}

– T is a formal type, used as parameter type• Above function returns variable of same type as

parameter– In function call, T replaced by real type

• If int, all T's become intsint x;int y = square(x);

Page 4: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

1 // Fig. 6.26: fig06_26.cpp2 // Using a function template.3 #include <iostream>4 5 using std::cout;6 using std::cin;7 using std::endl;

8 9 // definition of function template maximum 10 template < class T > // or template < typename T >11 T maximum( T value1, T value2, T value3 ) 12 { 13 T max = value1; 14 15 if ( value2 > max ) 16 max = value2; 17 18 if ( value3 > max ) 19 max = value3; 20 21 return max; 22 23 } // end function template maximum 24

Formal type parameter Tplaceholder for type of data to be tested by maximum.

maximum expects all parameters to be of the same type.

© 2003 Prentice Hall, Inc.All rights reserved.

Outline4

Page 5: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc.All rights reserved.

Outline5

25 int main()26 {27 // demonstrate maximum with int values28 int int1, int2, int3;29 30 cout << "Input three integer values: ";31 cin >> int1 >> int2 >> int3;

32 33 // invoke int version of maximum34 cout << "The maximum integer value is: "35 << maximum( int1, int2, int3 );

36 37 // demonstrate maximum with double values38 double double1, double2, double3;

39 40 cout << "\n\nInput three double values: ";41 cin >> double1 >> double2 >> double3;

42 43 // invoke double version of maximum44 cout << "The maximum double value is: "45 << maximum( double1, double2, double3 );46

maximum called with various data types.

Page 6: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

47 // demonstrate maximum with char values48 char char1, char2, char3;49 50 cout << "\n\nInput three characters: ";51 cin >> char1 >> char2 >> char3;

52 53 // invoke char version of maximum54 cout << "The maximum character value is: "55 << maximum( char1, char2, char3 ) 56 << endl;57 58 return 0; // indicates successful termination59 60 } // end main

Input three integer values: 1 2 3The maximum integer value is: 3

Input three double values: 3.3 2.2 1.1The maximum double value is: 3.3

Input three characters: A C BThe maximum character value is: C

© 2003 Prentice Hall, Inc.All rights reserved.

Outline6

Page 7: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

7

Recursion

• Recursive functions– Functions that call themselves– The function can only solve a simple case (base case)– When called with base case, it returns a result

• If not base case– Break problem into smaller problem(s)– Launch new copy of function to work on the smaller

problem (recursive call/recursive step)• Slowly converges towards base case• Function makes call to itself inside the return

statement

Page 8: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

8

Recursion

• If not base case– Eventually base case gets solved

• Then, it returns the result to the previous copy of the function

• A sequence of returns then start all the way up until the original function call eventually returns the final result to main

Page 9: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

9

Recursion

• Example: factorialn! = n * ( n – 1 ) * ( n – 2 ) * … * 1

– Recursive relationship ( n! = n * ( n – 1 )! )5! = 5 * 4!4! = 4 * 3!…

– Base case (1! = 0! = 1)

Page 10: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

10

Recursion

5!

5*4!

4*3!

3*2!

2*1!

1!

5!

5*4!

4*3!

3*2!

2*1!

1!

2! = 2*1 = 2 is returned

3! = 3*2 = 6 is returned

4! = 4*6 = 24 is returned

5! = 5*24 = 120 is returned

Final value = 120

1 returned

Processing of recursive calls Values returned from each recursive call

Page 11: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc.All rights reserved.

Outline11

1 // Fig. 6.29: fig06_29.cpp2 // Recursive factorial function.3 #include <iostream>4 5 using std::cout;6 using std::endl;

7 8 #include <iomanip>

9 10 using std::setw;

11 12 unsigned long factorial( unsigned long ); // function prototype13 14 int main()15 {16 // Loop 10 times. During each iteration, calculate 17 // factorial( i ) and display result.18 for ( int i = 0; i <= 10; i++ )19 cout << setw( 2 ) << i << "! = "20 << factorial( i ) << endl;21 22 return 0; // indicates successful termination23 24 } // end main

Data type unsigned longcan hold an integer from 0 to 4 billion.

Page 12: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

25 26 // recursive definition of function factorial 27 unsigned long factorial( unsigned long number )28 { 29 // base case 30 if ( number <= 1 ) 31 return 1; 32 33 // recursive step 34 else35 return number * factorial( number - 1 ); 36 37 } // end function factorial

0! = 11! = 12! = 23! = 64! = 245! = 1206! = 7207! = 50408! = 403209! = 362880

10! = 3628800

The base case occurs when we have 0! or 1!. All other cases must be split up (recursive step).

© 2003 Prentice Hall, Inc.All rights reserved.

Outline12

Page 13: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

13

Example Using Recursion: Fibonacci Series

• Fibonacci series: 0, 1, 1, 2, 3, 5, 8...– Each number sum of two previous ones– Example of a recursive formula:

• fib(n) = fib(n-1) + fib(n-2)

• C++ code for Fibonacci functionlong fibonacci( long n ){

if ( n == 0 || n == 1 ) // base casereturn n;

else return fibonacci( n - 1 ) + fibonacci( n – 2 );

}

Page 14: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

14

Example Using Recursion: Fibonacci Series

f( 3 )

f( 1 )f( 2 )

f( 1 ) f( 0 ) return 1

return 1 return 0

return +

+return

Page 15: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

15

Example Using Recursion: Fibonacci Series

• Order of operations– return fibonacci( n - 1 ) + fibonacci( n - 2 );

• Do not know which one executed first– C++ does not specify– Only &&, || and ?: guaranteed left-to-right

evaluation• Recursive function calls

– Each level of recursion doubles the number of function calls

• 30th number = 2^30 ~ 4 billion function calls– Exponential complexity

Page 16: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc.All rights reserved.

Outline16

1 // Fig. 6.30: fig06_30.cpp2 // Recursive fibonacci function.3 #include <iostream>

4 5 using std::cout;6 using std::cin;7 using std::endl;

8 9 unsigned long fibonacci( unsigned long ); // function prototype

10 11 int main()12 {13 unsigned long result, number;

14 15 // obtain integer from user16 cout << "Enter an integer: ";17 cin >> number;

18 19 // calculate fibonacci value for number input by user20 result = fibonacci( number );21 22 // display result23 cout << "Fibonacci(" << number << ") = " << result << endl;24 25 return 0; // indicates successful termination

The Fibonacci numbers get large very quickly, and are all non-negative integers. Thus, we use the unsigned long data type.

Page 17: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

26 27 } // end main28 29 // recursive definition of function fibonacci 30 unsigned long fibonacci( unsigned long n ) 31 { 32 // base case 33 if ( n == 0 || n == 1 ) 34 return n; 35 36 // recursive step 37 else 38 return fibonacci( n - 1 ) + fibonacci( n - 2 );39 40 } // end function fibonacci

Enter an integer: 0Fibonacci(0) = 0

Enter an integer: 1Fibonacci(1) = 1

Enter an integer: 2Fibonacci(2) = 1

Enter an integer: 3Fibonacci(3) = 2

© 2003 Prentice Hall, Inc.All rights reserved.

Outline17

Page 18: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

Enter an integer: 4Fibonacci(4) = 3

Enter an integer: 5Fibonacci(5) = 5

Enter an integer: 6Fibonacci(6) = 8

Enter an integer: 10Fibonacci(10) = 55

Enter an integer: 20Fibonacci(20) = 6765

Enter an integer: 30Fibonacci(30) = 832040

Enter an integer: 35Fibonacci(35) = 9227465

© 2003 Prentice Hall, Inc.All rights reserved.

Outline18

fig03_15.cppoutput (2 of 2)

Page 19: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

19

Recursion vs. Iteration

• Repetition– Iteration: explicit loop – Recursion: repeated function calls

• Termination– Iteration: loop condition fails– Recursion: base case recognized

• Both can have infinite loops• Balance between performance (iteration)

and good software engineering (recursion)

Page 20: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

20

Examples

• Power (x, y) function– long powerIteration (int x, int y)

• Greatest common divisor – gcd: the largest integer that evenly divides each of two integers– int gcd (int x, int y)

• Prime numbers – isPrime (int number)

• Tours of Hanoi – void hanoi(int n, char a, char b, char c)

Page 21: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

21

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 22: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

22

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 23: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

23

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 24: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

24

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 25: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

25

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 26: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

26

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 27: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

27

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 28: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

28

Tours of Hanoi

– Number of disks: N– Move disks from peg 1 to peg 3 (use peg 2 for temp. holding disks)– One disk moved at a time– A larger disk can never be replaced above a smaller one!

Peg 3Peg 1 Peg 2

Page 29: Outline Function Templates Recursion Example Using ...assi/courses/mech... · Function Templates Recursion Example Using Recursion: The Fibonacci Series Recursion vs. Iteration

© 2003 Prentice Hall, Inc. All rights reserved.

29

Tours of Hanoi

– Moving n disks can be viewed in terms of moving n-1 disks; hence recursion!

• a)- move n-1 disks from peg 1 to peg 2, using peg 3 as a temporarily holding area

• b)- move the last disk (the largest) from peg 1 to peg 3• c)- move n-1 disks from peg 2 to peg 3, using peg 1 as a

temporarily holding area– Process ends when the last task involves moving n=1 disk

(base case)• No need for a temp. holding area

– Hanoi function with 4 parameters• Number of disks to be moved ( N)• Peg where disks are initially (source peg)• Destination peg• Temp peg