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
Solving Problems
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: 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
Recursion
Recursive step simplifies 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 step simplifies 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 step simplifies 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
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 workRecursive 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
For Recursion To Work
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
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
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 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!