Question of the Day

# Question of the Day

## Question of the Day

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
##### Presentation Transcript

1. Question of the Day While walking across a bridge I saw a boat filled with people. Nobody boarded or left the boat, but on board the boat there was not a single person. How is this possible?

2. Question of the Day While walking across a bridge I saw a boat filled with people. Nobody boarded or left the boat, but on board the boat there was not a singleperson. How is this possible? Everybody on the boat was married.

3. Lecture 18:Recursion

4. Humorous Asides

5. “A journey begins with single step”

6. “A journey begins with single step”

7. “A journey begins with single step”

8. Solving Problems • Large problems hard to solve • Thinking about & solving small problems easier • Splitting problems into smaller ones often helps • Before you start coding, plan each assignment • Break up large methods with many ifs and loops • Move repeated action into small (private) methods

9. Smaller is Better

10. Smaller is Better CENSORED

11. Smaller is Better CENSORED (At least for programming)

12. Goal of a Java Method • Should be boring, easy, understandable drone • Given its parameters, perform the expected action • Only perform action defined for its parameters • Should not cure cancer • Do not worry about the larger problem • Solving entire problem is not this method’s issue • Split into tasks since solving whole problem hard

13. Recursion re-cur-sion:Method of solving problem by combining solutions to identical, smaller problems

14. Recursion re-cur-sion:Method of solving problem by combining solutions to identical, smaller problems

15. See Recursion Work • Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3!

16. See Recursion Work • Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3! = 4 *(3 * 2!)

17. See Recursion Work • Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3! = 4 *(3 * 2!) = 4 * (3 * (2 * 1!))

18. See Recursion Work • Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3! = 4 *(3 * 2!) = 4 * (3 * (2 * 1!)) • Base case(s) handle and solve obvious cases = 4 * (3 * (2 * 1))

19. See Recursion Work • Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3! = 4 *(3 * 2!) = 4 * (3 * (2 * 1!)) • Base case(s) handle and solve obvious cases = 4 * (3 * (2 * 1)) • After base case,combine solutions in recursive steps = 4 * (3 * 2)

20. See Recursion Work • Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3! = 4 *(3 * 2!) = 4 * (3 * (2 * 1!)) • Base case(s) handle and solve obvious cases = 4 * (3 * (2 * 1)) • After base case,combine solutions in recursive steps = 4 * (3 * 2) = 4 * 6

21. See Recursion Work • Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3! = 4 *(3 * 2!) = 4 * (3 * (2 * 1!)) • Base case(s) handle and solve obvious cases = 4 * (3 * (2 * 1)) • After base case,combine solutions in recursive steps = 4 * (3 * 2) = 4 * 6 = 24

22. For Recursion To Work • Very easy to create solution that does not work • Infinite recursion occurs if base case never reached • Frame-by-frame stack grows from method calls • StackOverflowErrorthrown by program

23. For Recursion To Work • Very easy to create solution that does not work • Recursive step must advance toward a base case • If there are multiple, which base case is unimportant • Get one step closer to base case at each recursive call • Must check if algorithm works for all possible inputs

24. Recursion in Java • A method is recursive if it calls itself: public static int factorial(int i) { if (i <= 1) { return 1; } else {return i * factorial(i - 1); } }

25. Recursion in Java Base case: Solution is simple • A method is recursive if it calls itself: public static intfactorial(inti) { if (i <= 1) { return 1; } else {intnextI = i – 1;int result = factorial(nextI); return i * result; } }

26. Recursion in Java • Recursive Step: • Take 1 step to solution • A method is recursive if it calls itself: public static intfactorial(inti) { if (i <= 1) { return 1; } else {intnextI = i – 1;int result = factorial(nextI); return i * result; } }

27. Recursion in Java • Recursive Step: • Take 1 step to solution • Make 1 or more recursive calls • A method is recursive if it calls itself: public static intfactorial(inti) { if (i <= 1) { return 1; } else {intnextI = i – 1;int result = factorial(nextI);return i * result; } }

28. Recursion in Java • Recursive Step: • Take 1 step to solution • Make 1 or more recursive calls • Simple process computes result • A method is recursive if it calls itself: public static intfactorial(inti) { if (i <= 1) { return 1; } else {intnextI = i – 1;int result = factorial(nextI);return i * result; } }

29. Recursive Method Basics • Start with check for base case(s) • These cases must return blatantly obvious answer • 1+ recursive calls found within recursive step(s) • Write these assuming recursive call works • Take 1 step toward base case (not 2, 3, or 10482)

30. Recursive Method Basics • Start with check for base case(s) • These cases must return blatantly obvious answer • 1+ recursive calls found within recursive step(s) • Write these assuming recursive call works • Take 1 step toward base case (not 2, 3, or 10482)

31. Tracing Recursion • No different than usual tracing we were doing • When method called, we add frame for the call • Local variables & parameters shown in frame • (Processors also include line being executed)

32. Tracing Recursion • No different than usual tracing we were doing • When method called, we add frame for the call • Local variables & parameters shown in frame • (Processors also include line being executed) NOT

33. Trace This, Buddy! static intfindMin(int[] a, int j) {if (j == a.length - 1) { return a[j];} else {intminFollowing = findMin(a, j+1); return Math.min(a[j], minFollowing);} } int[] example1 = { 0 }; findMin(example1, 0);

34. Trace This, Buddy! static intfindMin(int[] a, int j) {if (j == a.length - 1) { return a[j];} else {intminFollowing = findMin(a, j+1); return Math.min(a[j], minFollowing);} } int[] example2 = { 2, 3, 0, 1 }; findMin(example2, 0);