1 / 57

CSCE 110 PROGRAMMING FUNDAMENTALS WITH C++

CSCE 110 PROGRAMMING FUNDAMENTALS WITH C++. Prof. Amr Goneid AUC Part 12. Recursion. Recursion. Recursion. Definition Examples from Math Functions Why Recursion Rules for Recursion General Recursive Structures Famous Methods The Role of the Stack

apurdue
Download Presentation

CSCE 110 PROGRAMMING FUNDAMENTALS WITH C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CSCE 110PROGRAMMINGFUNDAMENTALSWITH C++ Prof. Amr Goneid AUC Part 12. Recursion Prof. amr Goneid, AUC

  2. Recursion Prof. amr Goneid, AUC

  3. Recursion • Definition • Examples from Math Functions • Why Recursion • Rules for Recursion • General Recursive Structures • Famous Methods • The Role of the Stack • Recursive Array processing using Exclude & Conquer • Recursive Array processing using Divide & Conquer • More Examples • Iterative VS Recursive Algorithms Prof. amr Goneid, AUC

  4. 1. Definition • recurFrom the Latin, re- = back +currere = to runTo happen again, especially at repeated intervals. • Many problems can be solved recursively, e.g. games of all types from simple ones like the Towers of Hanoi problem to complex ones like chess. • If a data structure may be defined recursively, it may be processed by a recursive function! Prof. amr Goneid, AUC

  5. Recursive Functions • Has the the ability to call itself. • A finite number of recursive calls with different input parameters in each call. • Desired result is obtained from current action and the contributions of previous actions (history). • Terminal action is predefined (does not need previous history). • The termination condition (Base Case) is obviously extremely important. If it is omitted, then the function will continue to call itself indefinitely. Prof. amr Goneid, AUC

  6. How It Works Big Problem (n) (General Case) n-1 n-2 Problem Gets Smaller Combine Base Case Get Previous History Prof. amr Goneid, AUC

  7. 2. Examples from Math Functions • Sum of the first n integers Sum(n) = 1+2+3+….+(n-1)+n // An Iterative Algorithm int sum (int n) { int i; int s = 0; for ( i = 1; i <= n; i++) s += i; return s; } Prof. amr Goneid, AUC

  8. Recursive Sum Algorithm The sum of the first n integers is defined as: // A Recursive Algorithm int sum (int n){ if ( n == 1) return 1; else return sum(n-1) + n; } Prof. amr Goneid, AUC

  9. Recursive Sum Algorithm(How it works) When we call sum(n), e.g. int k = sum(3); 6 sum (3) ……. 3 + sum(2) A general case 3 sum (2) ……. 2 + sum(1) Base case 1 sum(1) return 1 Prof. amr Goneid, AUC

  10. 3. Why Recursion • When current result depends on previous history. • Some problems are easier to code recursively. • When processing a large data structure that is composed of similar but smaller structures (e.g. trees). Prof. amr Goneid, AUC

  11. 4. Rules for Recursion • There must be a base case. • There is a general case other than the base case. • There is a path from a general case to the base case. • Successive recursive calls should take us towards the base case. The problem should get smaller in that direction. Prof. amr Goneid, AUC

  12. 5. General Recursive Structures • Structure(1): if (Base Case) {Terminal Action}; else {General Case Actions}; • Structure(2): if (! Base Case) {General case Actions}; Prof. amr Goneid, AUC

  13. Examples from Math Functions • Factorial of n = n! = 1*2*3…*n = Hence Factorial(n) = 1 for n = 0 (base case) = n * Factorial(n-1) for n > 0 Prof. amr Goneid, AUC

  14. Examples • An Iterative Factorial Function: int factorial (int n) { int i , f ; f = 1; if ( n > 0 ) for (i = 1; i <= n; i++) f * = i ; return f ; } Prof. amr Goneid, AUC

  15. Examples • A Recursive Factorial Function: int factorial (int n) { if (n <= 0) return 1; else return ( n * factorial (n-1)); } e.g. m = factorial(4); Prof. amr Goneid, AUC

  16. Factorial Tracing Prof. amr Goneid, AUC

  17. Example: Power Function • A numeric value x raised to an integer power: Prof. amr Goneid, AUC

  18. Power Function • A Recursive Function to return xn: double power (double x, int n) { if (n == 0 ) return 1.0; else return ( x * power(x,n-1)); } e.g. y = power(x , 5); Prof. amr Goneid, AUC

  19. Examples • A Recursive function to print elements of an array A from index s through index e. Main call may be printlist(A,0,n-1): void printlist (int A[ ], int s, int e) { if (s <= e ) { cout << A[s]; printlist (A, s+1, e); } } Prof. amr Goneid, AUC

  20. 6. Famous Methods • Exclude and Conquer n 1 n-1 1 1 Base Prof. amr Goneid, AUC

  21. Famous Methods • Divide and Conquer n n/2 n/2 n/4 n/4 Base Prof. amr Goneid, AUC

  22. 7. The Role of the Stack • Each call to a module pushes a stack frame on the stack. One stack frame has 3 items: • Where the jump to the module came from. • The input parameters • The result (or output parameters). Then it pops them out, returning results to the calling module. Pop Push Prof. amr Goneid, AUC

  23. The Role of the Stack • Example: factorial(2) returns 2 factorial(1) * 2 = 2 factorial(0) * 1 = 1 1 Base Case Prof. amr Goneid, AUC

  24. The Role of the Stack Prof. amr Goneid, AUC

  25. 8. Recursive Array processing using Exclude & Conquer • Recursive sum of array elements from location s through location e. int array_sum (int A[ ], int s, int e) { if (s == e) return A[s]; else return (A[s] + array_sum (A, s+1, e)); } Prof. amr Goneid, AUC

  26. Recursive Array processing using Exclude & Conquer • Number of zero elements in an array from location s through location e. int nzeros (int A[ ], int s, int e) { int k = (A[s] == 0? 1 : 0); if (s == e) return k; else return (k + nzeros (A, s+1, e)); } Prof. amr Goneid, AUC

  27. Recursive Array processing using Exclude & Conquer • Reversing an Array void ReverseArray (int A[ ], int s, int e) { if (s < e) { swap (A[s] , A[e]); ReverseArray ( A , s+1, e-1);} } Prof. amr Goneid, AUC

  28. Recursive Sequential Search • Recursive Sequential Search of x in array A from location s through location e. int LinSearch (int A[ ], int x, int s, int e) { if (x == A[s]) return s; else if (s == e) return -1; else return LinSearch (A,x,s+1,e); } Prof. amr Goneid, AUC

  29. Recursive Selection Sort • Recursive Selectsort of array A from location s through location e. Invoke e.g. as SelectSort(A , 1 , n) void SelectSort (int A[ ], int s, int e) { int m; if (s < e) { m = index_of_min(A,s,e); swap(A[m] , A[s]); SelectSort (A , s+1 , e); } } Prof. amr Goneid, AUC

  30. 9. Recursive Array Processing using Divide & Conquer • Maximum value in an array from location s through location e. • Assume we have a function that returns the greater of two values (a,b) int max2 (int a, int b) { return ((a > b)? a : b); } Prof. amr Goneid, AUC

  31. Maximum in an Array int maximum (int a[ ], int s, int e) { // Base Case if (s == e) return a[s]; else // General Case { int m = (s + e)/2; // Divide in the middle int maxL = maximum (a , s , m); // Conquer left half int maxR = maximum (a , m+1 , e); // Conquer right return max2 ( maxL , maxR); // Combine } } Prof. amr Goneid, AUC

  32. Recursive Binary Search • Search for an element x in an array A of elements sorted in ascending order. The function Bsearch (A,x,s,e) returns the index of x if found and -1 otherwise. A s mid e Prof. amr Goneid, AUC

  33. Recursive Algorithm int Bsearch (int A[ ], int x, int s, int e) { int mid; // Base case: No elements left, search failed if (s > e) return -1; else { // General case mid = (s+e) / 2; // Divide in the middle if (x == A[mid]) return mid; // Success at mid else (if x > A[mid]) // Conquer right return Bsearch(A,x,mid+1,e); else // Conquer left return Bsearch(A,x,s,mid-1); } } Prof. amr Goneid, AUC

  34. 10. More ExamplesThe Towers of Hanoi In the Towers of Hanoi game, there are 3 pegs (A , B , C) and N disks with varying sizes that can be stacked on a peg. The objective is to move all the disks from peg (A) to peg (C), probably by using the auxiliary peg (B). At any moment, no larger peg can be placed on top of a smaller one. Prof. amr Goneid, AUC

  35. The Towers of Hanoi For example: To move one disk from A to C: Move disk1 from A to C To move two disks (top is 1, bottom is 2): Move 1 from A to B Move 2 from A to C Move 1 from B to C To move N disks from A to C and we already know how to move N-1 disks from any one peg to another: Move the top N-1 disks by a series of legal moves from A to B using C Move Disk N from A to C directly Move N-1 disks from B to C using A Prof. amr Goneid, AUC

  36. Algorithm Obviously, this is a recursive problem that can be solved by the following recursive algorithm: Towers (N, A , C , B) { if N = 1 move disk 1 from A to C directly else { Towers ( N-1 , A , B , C) Move disk N from A to C directly Towers ( N-1 , B , C , A) } } Prof. amr Goneid, AUC

  37. Animation An animation is available at: http://www.cosc.canterbury.ac.nz/people/mukundan/dsal/ToHdb.html Prof. amr Goneid, AUC

  38. Euclide’s Algorithm for the GCD (Recursive Version) //Computes gcd(m, n) by Euclid’s algorithm //Input: Two nonnegative, not-both-zero integers m and n //Output: Greatest common divisor of m and n function gcd(m, n) if n = 0 return m else return gcd (n, m mod n) "The Euclidean algorithm is the granddaddy of all algorithms, because it is the oldest nontrivial algorithm that has survived to the present day”. Donald Knuth, The Art of Computer Programming, Vol. 2 Prof. Amr Goneid, AUC

  39. Non-Recursive Algorithm ALGORITHM Euclid (m, n) //Computes gcd(m, n) by Euclid’s algorithm //Input: Two nonnegative, not-both-zero integers m and n //Output: Greatest common divisor of m and n while n != 0 do r ←m mod n m←n n←r return m Prof. Amr Goneid, AUC

  40. Recursive Power Function(Divide & Conquer) A power function can be defined as follows: Prof. Amr Goneid, AUC

  41. Recursive Power Function The recursive function would be: double pow (double x, int n) { if (n == 0) return 1.0; else if (n == 1) return x; else if (n%2) return pow (x*x, n/2) * x; else return pow (x*x, n/2); Prof. Amr Goneid, AUC

  42. Binary Tree Traversal • A Binary Tree is a special data structure where a node has a maximum of two children • The nodes in the BST can be implemented as a linked structure: t 32 16 45 40 Prof. Amr Goneid, AUC

  43. Binary Tree Traversal • Algorithm: Pre-order Traversal (Visit parent before children) void PreOrder ( tree T) { if ( T != NULL) { Visit (T); PreOrder (T->left); PreOrder (T->right); } } • The resulting visit order = {a} {b , d , e} {c , f } T 1 a 5 2 b c 4 3 f d e 6 Prof. Amr Goneid, AUC

  44. Fractal Star Example: a Fractal Algorithm The following function draws recursive squares (called a fractal star). The drawing primitive is Box (x , y , n) which draws a square of side (n) pixels centered at (x,y) : void STAR( int x, int y, int n) { if (n > 1) { STAR(x-n , y+n , n/2); STAR(x+n , y+n , n/2); STAR(x-n , y-n , n/2); STAR(x+n , y-n , n/2); Box(x , y , n); } } Prof. Amr Goneid, AUC

  45. 11. Iterative VS Recursive Algorithms • Recursive Algorithms can be more elegant in programming and easier to understand. • They will cost about 5% more time than an equivalent iterative algorithm. • BUT, Sometimes a recursive algorithm can be a Disaster Prof. Amr Goneid, AUC

  46. Example: Fibonacci Numbers • Fibonacci numbers represent the sequence: 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,... • Introduced by Leonardo Fibonacci (1202) • Can be computed by the recurrence relation: Prof. Amr Goneid, AUC

  47. Fibonacci Numbers Fibonacci numbers are closely related to the Golden Ratio φ since: Prof. Amr Goneid, AUC

  48. The Golden Ratio Prof. Amr Goneid, AUC

  49. In Nature Prof. Amr Goneid, AUC

  50. In Nature Prof. Amr Goneid, AUC

More Related