Outline
CSE131: Computer Programming
Recursion
Prof. Mahmoud Khalil
2003 Prentice Hall, Inc.
All rights reserved.
2
Recursion
Outline
Recursion
Example Using Recursion: The Fibonacci Series
Recursion vs. Iteration
Functions with Empty Parameter Lists
2003 Prentice Hall, Inc. All rights reserved.
3
Recursion
• Recursive functions
– Functions that call themselves
– Can only solve a base case
• 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
– Eventually base case gets solved
• Answer works way back up, solves entire problem
2003 Prentice Hall, Inc. All rights reserved.
4
Recursion
• Example: factorial
n! = n * ( n – 1 ) * ( n – 2 ) * … * 1
– Recursive relationship ( n! = n * ( n – 1 )! )
5! = 5 * 4!
4! = 4 * 3!…
– Base case (1! = 0! = 1)
2003 Prentice Hall, Inc. All rights reserved.
5
1 // Fig. 3.14: fig03_14.cpp
2 // Recursive factorial function.
Outline
3 #include <iostream>
4
5 using std::cout;
fig03_14.cpp
6 using std::endl; (1 of 2)
7
8 #include <iomanip>
Data type unsigned long
9
10 using std::setw;
can hold an integer from 0 to
11 4 billion.
12 unsigned long factorial( unsigned long ); // function prototype
13
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 termination
23
24 } // end main
2003 Prentice Hall, Inc.
All rights reserved.
6
25
26 // recursive definition of function factorial
Outline
27 The base
unsigned long factorial( unsigned long number ) case occurs when we
28 { have 0! or 1!. All other cases
fig03_14.cpp
29 // base case must be split up (recursive
(2 of 2)
30 if ( number <= 1 ) step).
31 return 1;
32 fig03_14.cpp
33 // recursive step output (1 of 1)
34 else
35 return number * factorial( number - 1 );
36
37 } // end function factorial
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
2003 Prentice Hall, Inc.
All rights reserved.
7
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 function
long fibonacci( long n )
{
if ( n == 0 || n == 1 ) // base case
return n;
else
return fibonacci( n - 1 ) +
fibonacci( n – 2 );
}
2003 Prentice Hall, Inc. All rights reserved.
8
Example Using Recursion: Fibonacci Series
f( 3 )
return f( 2 ) + f( 1 )
return f( 1 ) + f( 0 ) return 1
return 1 return 0
2003 Prentice Hall, Inc. All rights reserved.
9
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
2003 Prentice Hall, Inc. All rights reserved.
10
1 // Fig. 3.15: fig03_15.cpp
2 // Recursive fibonacci function.
Outline
3 #include <iostream>
4
5 using std::cout;
fig03_15.cpp
The Fibonacci numbers get (1 of 2)
6 using std::cin;
7 using std::endl;
large very quickly, and are all
8 non-negative integers. Thus,
9 we useprototype
unsigned long fibonacci( unsigned long ); // function the unsigned
10 long data type.
11 int main()
12 {
13 unsigned long result, number;
14
15 // obtain integer from user
16 cout << "Enter an integer: ";
17 cin >> number;
18
19 // calculate fibonacci value for number input by user
20 result = fibonacci( number );
21
22 // display result
23 cout << "Fibonacci(" << number << ") = " << result << endl;
24
25 return 0; // indicates successful termination
2003 Prentice Hall, Inc.
All rights reserved.
11
26
27 } // end main
Outline
28
29 // recursive definition of function fibonacci
30 unsigned long fibonacci( unsigned long n )
fig03_15.cpp
31 { (2 of 2)
32 // base case
33 if ( n == 0 || n == 1 ) fig03_15.cpp
34 return n; output (1 of 2)
35
36 // recursive step
37 else
38 return fibonacci( n - 1 ) + fibonacci( n - 2 );
39
40 } // end function fibonacci
Enter an integer: 0
Fibonacci(0) = 0
Enter an integer: 1
Fibonacci(1) = 1
Enter an integer: 2
Fibonacci(2) = 1
Enter an integer: 3
Fibonacci(3) = 2
2003 Prentice Hall, Inc.
All rights reserved.
12
Enter an integer: 4
Fibonacci(4) = 3
Outline
Enter an integer: 5
Fibonacci(5) = 5
fig03_15.cpp
output (2 of 2)
Enter an integer: 6
Fibonacci(6) = 8
Enter an integer: 10
Fibonacci(10) = 55
Enter an integer: 20
Fibonacci(20) = 6765
Enter an integer: 30
Fibonacci(30) = 832040
Enter an integer: 35
Fibonacci(35) = 9227465
2003 Prentice Hall, Inc.
All rights reserved.
13
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)
2003 Prentice Hall, Inc. All rights reserved.