19
LECTURE 20: RECURSION CSC 212 – Data Structures

LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Embed Size (px)

DESCRIPTION

“A journey begins with a single step”

Citation preview

Page 1: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

LECTURE 20:RECURSIONCSC 212 – Data Structures

Page 2: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Humorous Asides

Page 3: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

“A journey begins with a single step”

Page 4: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

“A journey begins with a single step”

Page 5: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Large problems hard to solve Thinking about & solving small problems

easier Split large problems into smaller ones

Before you start coding, plan each assignment

Break up large methods with many ifs and loops

Action in many methods into small (private) methods

Solving Problems

Page 6: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

(At least for programming)

Smaller is Better

CENSORED

Page 7: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Should be boring, monotonous drone Given its parameters, perform the expected

action Only perform the action defined for its

parameters Should not cure cancer

Do not worry about the larger problem This greater solution is not this method’s concern

Solving entire programming assignment is hard Why we divide up tasks in the first place!

Goal of a Java Method

Page 8: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

re-cur-sion: Method of solving problem by combining solutions to identical, smaller problems

Recursion

Page 9: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Keep dividing until base case(s) reached Base cases are cases that are trivial to solve4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!))

After base case, combine solutions to complete work = 4 * (3 * (2 * 1)) = 4 * (3 * 2) = 4 * 6 = 24

See Recursion Work

Page 10: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Begin by figuring out what are the base case(s) Simple subproblem that is solved

immediately A base case will always be reached solving

problem Recursive step can then be generated

Create easier problem(s) which splits original problem

Combine subproblems’ solutions for final answer

Writing Recursive Solution

Page 11: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Will your solution work? Each step moves toward base case All possible inputs must be considered Otherwise, get infinite recursion

Working Recursive Solutions

Page 12: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

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

Page 13: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

public method starts the recursive process Usually only calls recursive method

private recursive method has 1+ parameter Results should only depend on the parameters if or switch selects from different cases

Using fields can avoid parameters… … but not recursive approach to solving the

problem Cheating recursion with fields does not scale

Designing Recursion

Page 14: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Should have immediately check for base case(s) Cannot have recursive calls within this code

Include 1+ method calls in recursive step(s) Assume recursion works when writing these Take 1 step toward base case (not 2, 3, or

10482)

Writing Recursive Method

Page 15: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Each call gets frame created for it Within frame, place all local variables &

parameters (Real frames include line being executed)

Trace shows frames solving their single step NO CURING CANCER

Tracing Recursion

X

Page 16: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

private static void rev(int[] a, int j) {int opposite = a.length - (j + 1);if (j < opposite) { rev(a, j + 1); int temp = a[j]; a[j] = a[opposite]; a[opposite] = temp;}

}public static void reverse(int[] a) { rev(a,0);

}

int[] example1 = { 0 };reverse(example1);

Trace This, Buddy!

Page 17: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

private static void rev(int[] a, int j) {int opposite = a.length - (j + 1);if (j < opposite) { rev(a, j + 1); int temp = a[j]; a[j] = a[opposite]; a[opposite] = temp;}

}public static void reverse(int[] a) { rev(a,0);

}

int[] example2 = { 0, 1, 2, 3, 4 };reverse(example2);

Trace This, Buddy!

Page 18: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Divide array in two parts First element & everything after

Last element & all preceding elements

Left & right halves of the array

Base case when working with 0 (or 1) entries

Recursive Array Handling

Page 19: LECTURE 20: RECURSION CSC 212 – Data Structures. Humorous Asides

Complete week #7 assignment Due by 5PM next Wednesday

Finish programming assignment #2 Due before next lecture (Wednesday)

Review sections 3.1-3.5 in book before class How do linked lists, arrays & recursion

work together? How do they work?

Before Next Lecture…