Humorous Asides
“A journey begins with single step”
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 if s and loops Move repeated action into small (private) methods Solving Problems
Smaller is Better
CENSORED
Smaller is Better (At least for programming) CENSORED
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 Goal of a Java Method
re-cur-sion re-cur-sion: Method of solving problem by combining solutions to identical, smaller problems Recursion
re-cur-sion re-cur-sion: Method of solving problem by combining solutions to identical, smaller problems Recursion
Recursive stepbase case(s) Recursive step simplifies problem to base case(s) Recast using slightly easier version in recursive step 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) See Recursion Work
Recursive stepbase case(s) Recursive step simplifies problem to base case(s) Recast using slightly easier version in recursive step 4! = 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 stepbase case(s) Recursive step simplifies problem to base case(s) Recast using slightly easier version in recursive step 4! = 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 See Recursion 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 OutOfMemoryException thrown 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 one Get one step closer to base case at each recursive call Must check if algorithm works for all possible inputs For Recursion To Work
recursive 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
recursive 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 obvious
recursive 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 Recursive Step: Takes 1 step to solution
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 1 Take 1 step toward base case (not 2, 3, or 10482) Recursive Method Basics
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 Tracing Recursion
static int findMin(int[] a, int j) { if (j == a.length - 1) { return a[j]; } else { int minFollowing = findMin(a, j+1); return Math.min(a[j], minFollowing); } } Trace This, Buddy!
static int findMin(int[] a, int j) { if (j == a.length - 1) { return a[j]; } else { int minFollowing = findMin(a, j+1); return Math.min(a[j], minFollowing); } } int[] example1 = { 0 }; findMin(example1, 0); Trace This, Buddy!
static int findMin(int[] a, int j) { if (j == a.length - 1) { return a[j]; } else { int minFollowing = findMin(a, j+1); return Math.min(a[j], minFollowing); } } int[] example2 = { 2, 3, 0, 1 }; findMin(example2, 0); Trace This, Buddy!
Your Turn Get into your groups and complete activity
For Next Lecture Re-read GT3.5 for Wednesday How do you write a recursive method? Can recursion involve 2 (or more) methods? How do you write a recursive method? Week #6 weekly assignment available now Angel also has programming assignment #1 Pulls everything together and shows off your stuff