18
C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

Embed Size (px)

Citation preview

Page 1: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

C++ ProgrammingLecture 12

Functions – Part IV

ByGhada Al-MashaqbehThe Hashemite UniversityComputer Engineering Department

Page 2: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 2

Outline

Introduction. Recursion. Reference parameters and

variables. Functions call by reference and call

by value. Examples.

Page 3: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 3

Recursion I Recursive functions

Are functions that calls themselves. Can only solve a base case. If not base case, the function breaks the problem

into a slightly smaller, slightly simpler, problem that resembles the original problem and

Launches a new copy of itself to work on the smaller problem, slowly converging towards the base case

Makes a call to itself inside the return statement Eventually the base case gets solved and then

that value works its way back up to solve the whole problem.

The recursion step executes while the original call to the function is still open (not finished yet).

Page 4: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 4

Recursion II Example: factorial

n! = n * ( n – 1 ) * ( n – 2 ) * … * 1 Can be solved either iteratively or recursively:

Iteratively:int factorial = 1;for (int count = n; count >= 1; count--)

factorial *= count; Recursively:

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

Base case (1! = 0! = 1)

Page 5: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 5

Example Using Recursion: The 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 function

long fibonacci( long n )

{

if ( n == 0 || n == 1 ) // base case

return n;

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

}

 

Page 6: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 6

Example Using Recursion: The Fibonacci Series Diagram of Fibonacci function

f( 3 )

f( 1 )f( 2 )

f( 1 ) f( 0 ) return 1

return 1 return 0

return +

+return

Page 7: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

1. Function prototype

1.1 Initialize variables

2. Input an integer

2.1 Call function fibonacci

2.2 Output results.

3. Define fibonacci recursively

1 // Fig. 3.15: fig03_15.cpp

2 // 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 );

10

11 int main()

12 {

13 unsigned long result, number;

14

15 cout << "Enter an integer: ";

16 cin >> number;

17 result = fibonacci( number );

18 cout << "Fibonacci(" << number << ") = " << result << endl;

19 return 0;

20 }

21

22 // Recursive definition of function fibonacci

23 unsigned long fibonacci( unsigned long n )

24 {

25 if ( n == 0 || n == 1 ) // base case

26 return n;

27 else // recursive case

28 return fibonacci( n - 1 ) + fibonacci( n - 2 );

29 }

Only the base cases return values. All other cases call the fibonacci function again.

Page 8: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

Program Output

Enter an integer: 0Fibonacci(0) = 0

Enter an integer: 1Fibonacci(1) = 1

Enter an integer: 2Fibonacci(2) = 1

Enter an integer: 3Fibonacci(3) = 2

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

Page 9: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 9

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 10: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 10

Reference Variables I Reference variable is an alias to some

variable. & (ampersand) is used to signify a

reference E.g:

int x = 0;int &y = x; //y is a reference to an integer which is x

Here y is an alias to the variable x since the address of y is equal to the address of x.

So, modifying either x or y both variables will have the same modified value since both of them refer to the same memory location or address.

Page 11: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 11

Reference Variables II Reference variables must be initialized

within the same statement that define them, if not it will a syntax error.

Reference variables must be initialized with a variable only, constants and expressions are not allowed syntax error.

You cannot reassign the reference variable to another variable since you simply copy the value of the new variable in the old one and you still working on the old one and this is considered as a logical error.

Page 12: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 12

Call By Reference I Two types of function call:

Call by value Copy of data passed to function. Changes to copy do not change the original

found in the caller. Used to prevent unwanted side effects.

Call by reference Function can directly access data. Changes affect the original found in the caller. No copy exist (reduce overhead), however, it

is dangerous since the original value is overwritten.

Page 13: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 13

Call By Reference II Function arguments can be passed by

reference. In both the function header and

prototype you must proceed the reference variable by &.

In the function call just type the name of the variable that you want to pass.

Inside the function body use the reference variable by its name without &.

Page 14: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 14

Call By Reference III Again the reference argument must be

a variable (constants or expressions are not allowed syntax error)

E.g.:void change( int &variable )

{ variable += 3; } Adds 3 to the input variable which also

affects the original variable (passed as argument to function change in the caller).

Page 15: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 15

Call By Reference IV Note that till now we have talked about the

function arguments or parameters to be reference variables. But what about the return result? Can we make it a reference variable?

If the function return a reference variable this means that it returns an alias to a variable inside that function.

If this variable is not static (i.e. automatic) then this variable will be destroyed when the function ends.

So, this function will return a reference to undefined variable which is called dangling reference.

Such thing is considered as a logical error. As possible avoid the usage of reference return

results even to s static variables.

Page 16: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 16

1 // Fig. 3.20: fig03_20.cpp

2 // Comparing call-by-value and call-by-reference

3 // with references.

4 #include <iostream>

5

6 using std::cout;

7 using std::endl;

8

9 int squareByValue( int );

10 void squareByReference( int & );

11

12 int main()

13 {

14 int x = 2, z = 4;

15

16 cout << "x = " << x << " before squareByValue\n"

17 << "Value returned by squareByValue: "

18 << squareByValue( x ) << endl

19 << "x = " << x << " after squareByValue\n" << endl;

20

21 cout << "z = " << z << " before squareByReference" << endl;

22 squareByReference( z );

23 cout << "z = " << z << " after squareByReference" << endl;

24

25 return 0;

26 }

27

28 int squareByValue( int a )

29 {

30 return a *= a; // caller's argument not modified

31 }

Notice the use of the & operator

Page 17: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 17

x = 2 before squareByValueValue returned by squareByValue: 4x = 2 after squareByValue z = 4 before squareByReferencez = 16 after squareByReference

32

33 void squareByReference( int &cRef )

34 {

35 cRef *= cRef; // caller's argument modified

36 }

Page 18: C++ Programming Lecture 12 Functions – Part IV By Ghada Al-Mashaqbeh The Hashemite University Computer Engineering Department

The Hashemite University 18

Additional Notes

This lecture covers the following material from the textbook: Fourth Edition

Chapter 3: Sections 3.12, 3.13, 3.14, 3.17