Download Presentation
## Question of the Day

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -

**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?**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.**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**Smaller is Better**CENSORED**Smaller is Better**CENSORED (At least for programming)**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**Recursion**re-cur-sion:Method of solving problem by combining solutions to identical, smaller problems**Recursion**re-cur-sion:Method of solving problem by combining solutions to identical, smaller problems**See Recursion Work**• Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3!**See Recursion Work**• Recursive stepsimplifies problem to base case(s) • Recast using slightly easier version in recursive step4! = 4 *3! = 4 *(3 * 2!)**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!))**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))**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)**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**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**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**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**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); } }**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; } }**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; } }**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; } }**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; } }**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)**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)**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)**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**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);**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);**Your Turn**• Get into your groups and complete activity**For Next Lecture**• Re-read GT3.5 for Friday • How do you write a recursive method? • Can recursion involve 2 (or more) methods? • How do you write a recursive method? • Week #7 weekly assignment available now • Angel also has programming assignment #1 • Pulls everything together and shows off your stuff