1 / 24

Lecture 2 Aug 28 goals: Introduction to recursion

Lecture 2 Aug 28 goals: Introduction to recursion examples of recursive programs. Recursion Recursive program A function that calls itself. e.g. f(x)= 2 * f(x – 1) Recursive definition defining a concept in terms of itself.

ollie
Download Presentation

Lecture 2 Aug 28 goals: Introduction to recursion

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. Lecture 2 Aug 28 • goals: • Introduction to recursion • examples of recursive programs

  2. Recursion • Recursive program • A function that calls itself. • e.g. f(x)= 2 * f(x – 1) • Recursive definition • defining a concept in terms of itself. • e.g. an arithmetic expression is either a number, or is of the form X op Y where X and Y are arithmetic expressions and op is an operator. • Recursive data structure • a structure whose substructure is of the same type as the structure

  3. Recursion • Recursive data structure • a structure whose substructure is of the same type as the structure • e.g. a binary tree is either a single node or a node with two children both of which are also binary trees.

  4. Recursion - rules Rule 1: Provide exit from recursion. (focus on base cases – some times, more than one base case is needed.) Rule 2: Make sure that the successive recursive calls progress towards the base case. Rule 3: Assume that recursive calls work. Rule 4: Compound interest rule: Avoid redundant calls.

  5. Recursion – simple examples • Compute n! • n! = 1 x 2 … x n = (n – 1)! x n • 2) Compute 1 + 2 + … + n • f(n) = n + f(n – 1) • 3) Compute the n-th Fibonacci number • f(n) = f(n – 1) + f(n – 2)

  6. Example: (from Chapter 2 of text) Given x and n, we want to compute xn. Obvious iterative solution: int exp(int x, int n) { int temp = x; for (int j= 1; j < n; ++j) temp*= x; return temp; } The number of multiplications performed is n – 1. We will now see that a recursive algorithm will provide a much faster solution. Faster algorithm is crucial for RSA encryption algorithm.

  7. Idea behind the algorithm • Rule of exponents: • xn = (x2)n/2 if n is even • x * (x2)(n-1)/2 if n is odd • base case n = 1  return x • even n  call exp(x*x , n/2) and return the result. • odd n  call exp(x*x, (n – 1)/2) and multiply the result of call by x and return the output.

  8. Code for recursive exponent algorithm int exp (int x, int n) { if (n == 1) return x; else if (n%2 == 0) return exp(x*x, n/2); else return x* exp(x*x, (n – 1)/2); } Fact: When called to compute exp(x,100000), the iterative algorithm performs 99999 multiplications while the recursive algorithm will performs 21 multiplications.

  9. Recursive algorithm for modular exponentiation • In cryptography (RSA algorithm), the following problem arises. • Given x, n and m, compute xn (mod m). • In addition to the recursive algorithm we described above, we need one more idea to make this computation feasible. • In practice, x, n and m are extremely large numbers, with hundreds of digits in it.

  10. Modular exponentiation algorithm int exp (int x, int n, int m) { if (n == 1) return x % m; else if (n%2 == 0) return exp((x*x) % m, n/2); else return (x* exp((x*x) % m, (n – 1)/2)) % m; }

  11. An example involving 1-d array Given two segments of sorted arrays A and B, output the result of merging them as a single sorted array. B A merge(A, 2, 3, B, 9, 13) should return 0 1 2 3 4 5 6 1 2 2 3 4 4 5 merge(A, 2, 2, B, 9,10) should return the array 1 2 4 merge(A, 3, 4, B, 9, 8) should return 5 7 since the second array is empty. (high index < low index means the array is empty.)

  12. What are the base cases?

  13. What are the base cases? • one array segment is empty. • In this case, what is the output?

  14. What are the base cases? • one array segment is empty. • In this case, what is the output? • The other array segment, so we just have to copy the segment to the output.

  15. What are the base cases? • one array segment is empty. • In this case, what is the output? • The other array segment, so we just have to copy the segment to the output. • what if both segments are not empty? We need to make recursive call.

  16. Before we proceed, we need to make a change to the prototype of the function merge. Why? • We need to add two more parameters - the name of the array and the starting index in the output array at which we want to write.

  17. A B merge(A, 2, 3, B, 9, 13, C, 3) should return 3 4 5 6 7 8 9 C 1 2 2 3 4 4 5

  18. merge(A, low1,high1, B, low2, high2, C, low) B A Case 1: A[low1] < B[low2] Example: merge(A, 9, 13, B, 2, 3, C, 0) 0 1 2 3 4 5 6 C 1 2 2 3 4 4 5

  19. merge(A, low1,high1, B, low2, high2, C,low) B A Case 1: A[low1] < B[low2] Example: merge(A, 9, 13, B, 2, 3, C, 0) Step1: move A[low1] to C[low]. Now a recursive call to merge will get the rest of the job done. What call? 0 1 2 3 4 5 6 1 2 2 3 4 4 5

  20. merge(A, low1,high1, B, low2, high2) B A Case 1: A[low1] < B[low2] Example: merge(A, 9, 13, B, 2, 3, C, 0) Step1: move A[low1] to Out[0]. Now a recursive call to merge will get the rest of the job done. What call? merge(A, low1+1, high1, B, low2,high2, C, low + 1) 0 1 2 3 4 5 6 1 2 2 3 4 4 5

  21. Case 2: A[low1] > B[low2]. Move B[low2] to C[low] and make a recursive call to merge(A,low1, high1, B, low2+1, high2, C, low+1) The complete code is shown below:

  22. void merge(int A[], int low1, int high1, int B[], int low2,int high2, int C[], int low) { if (high1 < low1) copy(B, low2, high2, C,low); else if (high2 < low2) copy(A, low1, high1, C,low); else if (A[low1] < B[low2]) {C[low] = A[low1]; merge(A,low1+1, high1, B, low2, high2, C,low + 1);} else {C[low] = B[low2]; merge(A,low1, high1, B, low2+1, high2, C,low + 1); } } void copy(int A[], int s, int t, int B[], int s1) { for (int j= s; j<= t; ++j) B[s1 +j - s] = A[j]; }

  23. Last example: recursion and a linked list. Suppose we want to insert a key x as a last item of a list. a c g k x = ‘b’ a c g k b

  24. void insertLast(int k) { // insert k as the last item of the list Node* tmp = new Node(k); if (head == 0) head = tmp; else if (head->next == 0) { head->next = tmp;} else {List rest; rest.head = head->next; rest.insertLast(k); } }

More Related