360 likes | 483 Views
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.
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