Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture 3.4: Recursive Algorithms CS 250, Discrete Structures, Fall 2011 Nitesh Saxena *Adopted from previous lectures by Zeph Grunschlag.

Similar presentations


Presentation on theme: "Lecture 3.4: Recursive Algorithms CS 250, Discrete Structures, Fall 2011 Nitesh Saxena *Adopted from previous lectures by Zeph Grunschlag."— Presentation transcript:

1 Lecture 3.4: Recursive Algorithms CS 250, Discrete Structures, Fall 2011 Nitesh Saxena *Adopted from previous lectures by Zeph Grunschlag

2 10/06/2011 Lecture 3.4 -- Recursive Algorithms2 Course Admin Graded Mid-Term 1 Please pick them up, if you haven’t done so HW2 Being graded Expected to have the results by coming weekend Solution posted HW3 to be posted soon Early coming week Covers “Induction and Recursion” (Chapter 5) Due in 2 weeks (from the date of posting)

3 10/06/2011 Lecture 3.4 -- Recursive Algorithms3 Course Admin Mid-Term 2 Exam Thu, Oct 20, in class, 11-12:15. Covers Chapter 5 (lecture 3.*) No class on Oct 13 – Fall Break No class on Oct 18 I am traveling to attend and present a paper at the ACM Conference on Computer and Communications Security, Chicago, from Oct 16 -- 19 This will not affect our overall material coverage. Please utilize this time for studying for the exam

4 10/06/2011 Lecture 3.4 -- Recursive Algorithms4 Outline Recursive Algorithms and Programs Proving the correctness of recursive programs

5 10/06/2011 Lecture 3.4 -- Recursive Algorithms5 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } Compute 5!

6 10/06/2011 Lecture 3.4 -- Recursive Algorithms6 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } f(5)= 5·f(4)

7 10/06/2011 Lecture 3.4 -- Recursive Algorithms7 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } f(4)= 4·f(3) f(5)= 5·f(4)

8 10/06/2011 Lecture 3.4 -- Recursive Algorithms8 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } f(3)= 3·f(2) f(4)= 4·f(3) f(5)= 5·f(4)

9 10/06/2011 Lecture 3.4 -- Recursive Algorithms9 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } f(2)= 2·f(1) f(3)= 3·f(2) f(4)= 4·f(3) f(5)= 5·f(4)

10 10/06/2011 Lecture 3.4 -- Recursive Algorithms10 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } f(1)= 1·f(0) f(2)= 2·f(1) f(3)= 3·f(2) f(4)= 4·f(3) f(5)= 5·f(4)

11 10/06/2011 Lecture 3.4 -- Recursive Algorithms11 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } f(0)= 1  f(1)= 1·f(0) f(2)= 2·f(1) f(3)= 3·f(2) f(4)= 4·f(3) f(5)= 5·f(4)

12 10/06/2011 Lecture 3.4 -- Recursive Algorithms12 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } 1·1= 1  f(2)= 2·f(1) f(3)= 3·f(2) f(4)= 4·f(3) f(5)= 5·f(4)

13 10/06/2011 Lecture 3.4 -- Recursive Algorithms13 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } 2·1= 2  f(3)= 3·f(2) f(4)= 4·f(3) f(5)= 5·f(4)

14 10/06/2011 Lecture 3.4 -- Recursive Algorithms14 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } 3·2= 6  f(4)= 4·f(3) f(5)= 5·f(4)

15 10/06/2011 Lecture 3.4 -- Recursive Algorithms15 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } 4·6= 24  f(5)= 5·f(4)

16 10/06/2011 Lecture 3.4 -- Recursive Algorithms16 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } 5·24= 120 

17 10/06/2011 Lecture 3.4 -- Recursive Algorithms17 Recursive Algorithms Computer Implementation long factorial(int n){ if (n==0) return 1; return n*factorial(n-1); } Return 5! = 120

18 10/06/2011 Lecture 3.4 -- Recursive Algorithms18 From Recursive Definitions To Recursive Algorithms In general, starting a recursive function: gives a recursive algorithm: output-type f(input-type n) { if (n in range 1 ) return output 1 … if (n in range k ) return output k }

19 10/06/2011 Lecture 3.4 -- Recursive Algorithms19 Efficiency of Recursive Algorithms Examples We can also turn the recursive definitions of the Fibonacci function, and the gcd into recursive algorithms, but in the case of Fibonacci, these algorithms are really bad (as far as running time is concerned). Here’s the pseudocode for these examples:

20 10/06/2011 Lecture 3.4 -- Recursive Algorithms20 Recursive Algorithms Fibonacci integer f (non-neg. integer n){ if (n  1) return n return f (n -1) + f (n -2) } We need to at most 2 n calls to the function f() to be able to evaluate it for input n. Because going from n to n-1 spawns off 2 method calls, and each of these, in turn, spawns 2 threads, and so on. Even if n is moderately large, this algorithm will take a long time to compute

21 10/06/2011 Lecture 3.4 -- Recursive Algorithms21 Recursive Algorithms Fibonacci Q: Is there a better algorithm? A: Use iterative algorithm instead of a recursive one, especially for large numbers integer fibonacci(non-neg-integer n){ f[0]=0, f[1]=1 //array or sequence for (i = 2 to n ) { f[i] = f[i-1] + f[i-2] } return f[n] }

22 10/06/2011 Lecture 3.4 -- Recursive Algorithms22 Recursive Algorithms gcd integer gcd ( positive integer x, positive integer y) { if (y == 0 ) return x return gcd(y,x % y) } Running time: The algorithm is actually very efficient. It is linear with respect to the length of the largest input. Note that every time you recursively call the function, the size of inputs reduces.

23 10/06/2011 Lecture 3.4 -- Recursive Algorithms23 Program Correctness Induction can be used to show that programs using iterative loops are correct. Ex: Prove that the following program correctly calculates Fibonacci sequence: integer fibonacci(non-neg-integer n){ f[0]=0, f[1]=1 for (i = 2 to n ) { f[i] = f[i-1] + f[i-2] } return f[n] }

24 10/06/2011 Lecture 3.4 -- Recursive Algorithms24 Program Correctness Fibonacci Example integer fibonacci(non-neg-integer n){ f[0]=0, f[1]=1 for (i = 2 to n ) { f[i] = f[i-1] + f[i-2] } return f[n] } Apply strong mathematical induction Show that the program returns the correct output for n=0 Assume that the program returns the correct output for n=k, n=k-1,…,n=0, and using this assumption, show that the program returns the correct output for n=k+1 Let’s use the whiteboard to do this proof!

25 10/06/2011 Lecture 3.4 -- Recursive Algorithms25 Program Correctness Fibonacci Example integer fibonacci(non-neg-integer n){ for (i = 2 to n ) { f[i] = f[i-1] + f[i-2] } return f[n] } What’s wrong here?

26 10/06/2011 Lecture 3.4 -- Recursive Algorithms26 Today’s Reading Rosen 5.4


Download ppt "Lecture 3.4: Recursive Algorithms CS 250, Discrete Structures, Fall 2011 Nitesh Saxena *Adopted from previous lectures by Zeph Grunschlag."

Similar presentations


Ads by Google