Download presentation
Presentation is loading. Please wait.
Published byMillicent Parsons Modified over 6 years ago
1
Andy Wang Object Oriented Programming in C++ COP 3330
Recursion Andy Wang Object Oriented Programming in C++ COP 3330
2
Recursion A recursive function is a function that calls itself
Many tasks can be done with either recursion or with iteration Iteration involves a loop, but not recursive calls Make sure the recursion stops at some point Infinite recursion will result in a crash, when stack frames overrun the limit
3
One example: Factorials
n! = n*(n – 1)*(n – 2)…*1 Iteratively, we can define a function as follows unsigned long Factorial(int n) { unsigned long f = 1; for (int j = n; j >= 1; j--) f *= I; return f; }
4
One example: Factorials
But, notice that n! = n*(n – 1)*(n – 2)…*1 = n*(n – 1)! We can define a recursive function unsigned long Factorial(int n) { if (n <= 1) return 1; else return (n*Factorial(n – 1)); }
5
One example: Factorials
The recursive function will end when n = 1 Each recursive call will call the function with a smaller n So, which is better? The performance is similar in this case Recursive version uses more memory Each recursive call takes one stack frame
6
Is Recursion Better? Depends! Let’s check out the Fibonnaci example
A Fibonnaci number is defined recursively First and the second elements are both 1 Nth element is the sum of elements n – 1 and n – 2 Fib(n) = Fib(n – 1) + Fib(n – 2)
7
Is Recursion Better? Iterative Fibonnaci function int Fib(int n) {
int n1 = 1, n2 = 1, n3; int j = 2; while (j < n) { n3 = n1 + n2; n2 = n3; n1 = n2; j++; } return n
8
Is Recursion Better? Recursive Fibonnaci function int Fib(int n) {
if (n <= 0) return 0; else if (n == 1) return 1; else return Fib(n – 1) + Fib(n – 2); }
9
Which One is More Efficient?
Try them out! on/fib.cpp Fib 10, 20, 30, 40, 50… Iterative version is definitely faster
10
Recursion vs. Iteration
Any recursive solution can be done iteratively A recursive solution is often easier to code Recursion does involve extra overhead Function calls, stack frames Iterative solutions are typically faster
11
Sorting Algorithms Many solutions
You’ve probably seen bubble sort and selection sort Two sort algorithms (often written with recursion) are much faster Quick sort Merge sort
12
GCD Example r19-5.cpp Compute the greatest common divisor
13
Pr19-5.cpp #include <iostream> using namespace std; int gcd(int x, int y) { if (x % y == 0) return y; else return gcd(y, x % y); } int main() { int num1, num2; cout << “Enter two integers: “; cin >> num1 >> num2; cout << “The GDC of “ << num1 << “ and “ << num2 << “ is “ << gcd(num1, num2) << endl; return 0;
14
More Recursion Examples
13-01.cpp: write a number vertically using recursion 13-02.cpp: write a number vertically using iteration 13-03.cpp: raise a number to a power of n (recursion) 13-06.cpp: binary search (recursion) 13-08.cpp: binary search (iteration)
15
13-01.cpp #include <iostream> using namespace std; void writeVertical(int n) { if (n < 10) { cout << n << endl; } else { writeVertical(n/10); cout << (n % 10) << endl; }
16
13-01.cpp int main() { cout << “writeVertical(3):” << endl; writeVertical(3); cout << “writeVertical(12):” << endl; writeVertical(12); cout << “writeVertical(123):” << endl; writeVertical(123); return 0; }
17
13-02.cpp Power of ten that has the same number of digits as n (nsTens = 1000 if n = 2345) #include <iostream> using namespace std; void writeVertical(int n) { int nsTens = 1; int leftEndPiece = n; while (leftEndPiece > 9) { leftEndPiece = leftEndPiece / 10; nsTens = nsTens*10; } for (int powerOf10 = nsTens; powerOf10 > 0; powerOf10 = powerOf10/10) { cout << (n/powerOf10) << endl; n = n % powerOf10;
18
13-02.cpp int main() { cout << “writeVertical(3):” << endl; writeVertical(3); cout << “writeVertical(12):” << endl; writeVertical(12); cout << “writeVertical(123):” << endl; writeVertical(123); return 0; }
19
13-03.cpp #include <iostream> #include <cstdlib> using namespace std; int power(int x, int n) { if (n < 0) { cout << “Illegal argument to power.\n”; exit(1); } if (n > 0) return (power(x, n – 1)* x); else // n == 0 return 1;
20
13-03.cpp int main() { for (int n = 0; n < 4; n++) { cout << “3 to the power “ << n << “ is “ << power(3, n) << endl; } return 0;
21
13-06.cpp #include <iostream> using namespace std; const int ARRAY_SIZE = 10; void search(const int a[], int first, int last, int key, bool &found, int &location) { int mid; if (first > last) found = false else { mid = (first + last/2) if (key == a[mid]) { found = true; location = mid; } else if (key < a[mid] search(a, first, mid – 1, key, found, location); else if (key > a[mid] search(a, mid + 1, last, key, found, location); }
22
13-06.cpp int main() { int a[ARRAY_SIZE]; cout << “Array contains:\n”; for (int j = 0; j < ARRAY_SIZE; J++) { a[j] = 3*j; cout << a[j] << ‘ ‘; } cout << endl; …
23
13-06.cpp int key, location; bool found; cout << “Enter number to be located: “; cin >> key; search(a, 0, ARRAY_SIZE – 1, key, found, location); if (found) cout << key << “ is in index location “ << location << endl; else cout << key << “ is not in the array.” << endl; return 0; }
24
13-06.cpp #include <iostream> using namespace std; const int ARRAY_SIZE = 10; void search(const int a[], int lowEnd, int highEnd, int key, int first = lowend, last = highEnd, mid; found = false; while ((first <= last) && !found) { mid = (first + last)/2 if (key == a[mid]) { found = true; location = mid; } else if (key < a[mid]) last = mid – 1; } else if (key > a[mid]) first = mid + 1; }
25
13-08.cpp int main() { int a[ARRAY_SIZE]; cout << “Array contains:\n”; for (int j = 0; j < ARRAY_SIZE; J++) { a[j] = 3*j; cout << a[j] << ‘ ‘; } cout << endl; …
26
13-08.cpp int key, location; bool found; cout << “Enter number to be located: “; cin >> key; search(a, 0, ARRAY_SIZE – 1, key, found, location); if (found) cout << key << “ is in index location “ << location << endl; else cout << key << “ is not in the array.” << endl; return 0; }
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.