28
LECTURE 18: RECURSION

Humorous Asides “A journey begins with single step”

Embed Size (px)

Citation preview

LECTURE 18:RECURSION

Humorous Asides

“A journey begins with single step”

“A journey begins with single step”

“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 ifs and

loops Move repeated action into small (private)

methods

Solving Problems

Smaller is Better

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: 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!

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