cs 211: recursion

19
CS 211: Recursion Chris Kauffman Week 13-1

Upload: others

Post on 16-Mar-2022

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CS 211: Recursion

CS 211: Recursion

Chris Kauffman

Week 13-1

Page 2: CS 211: Recursion

Front Matter

Goals TodayRecursion and Stacks and P6

Lab 13: Recursion Exercises

P6: Mouse MazeI Search for paths from Mouse

to CheeseI Medium sized projectI Tricky problems

Reading

I BJP Ch 12: RecursionI Lab Manual Ch 18:

Recursion

Schedule

4/18 Mon RecursionWed Stacks

Lab Exercises4/25 Mon Linear/Binary Search

Wed SortingLab ReviewP6 Due

5/2 Mon Queues5/4 Wed Review

Page 3: CS 211: Recursion

Rabbits

A puzzle.1

Consider the growth of an idealized (biologicallyunrealistic) rabbit population, assuming that:

I A newly born pair of rabbits, one male, one female,are put on an island;

I Rabbits are able to mate at the age of one month sothat at the end of its second month a female canproduce another pair of rabbits;

I Rabbits never die and a mating pair always producesone new pair (one male, one female) every monthfrom the second month on.

How many pairs will there be in one year?

1Adapted from Wikipedia

Page 4: CS 211: Recursion

Simulation

Write a program to simulate the rabbit population.I First we should develop a general approachI Look at some data for this

Page 5: CS 211: Recursion

TabularlyMature pair produce baby pair the following month

BN Baby pair from pair NMN Mature pair from pair N

Month 0 1 2 3 4 5 6 7Pairs 0 1 1 2 3 5 8 13Pair 0 BI MI MI MI MI MI MIPair 1 B0 M0 M0 M0 M0Pair 2 B0 M0 M0 M0Pair 3 B0 M0 M0Pair 4 B1 M1 M1Pair 5 B0 M0Pair 6 B1 M1Pair 7 B2 M2Pair 8 B0Pair 9 B1Pair 10 B2Pair 11 B3Pair 12 B4

Page 6: CS 211: Recursion

Pattern

How does the population of a month relate to previous months?

Page 7: CS 211: Recursion

Recursively

Population for Month i = Pop. Month i-1 + Pop. Month i-2Better known as Fibonnaci Numbers:

f0 = 0

f1 = 1

fi = fi−1 + fi−2

public static int fib(int n)I Recursive implementation?I Iterative implementation?I Call Stack behavior in each

Page 8: CS 211: Recursion

Recursion is. . .Something specified in terms of a smaller version of itself

Page 9: CS 211: Recursion

Recursion involves

Base CaseThe "smallest thing", where you can definitively say "here is theanswer"

Inductive/Recursive CaseIf I had the answer to a few smaller versions of this problem, I couldcombine them to get the answer to this problem.

Page 10: CS 211: Recursion

Identify Base and Recursive Cases

Fibonacci

f0 = 0

f1 = 1

fi = fi−1 + fi−2

Factorial

fact(n) = n ∗ fact(n − 1)

fact(0) = 1

Page 11: CS 211: Recursion

Examine Stack Trace for Fibonacci

Recursive

public static int fibR(int n)

I Recursive implementationI View Stack Trace of fibR(4)

Recursive

public static int fibI(int n)

I Iterative implementation?I View Stack Trace of fibI(4)

PointRecursion utilizes the Stack to store information about history

Page 12: CS 211: Recursion

Other Uses for RecursionEnumerationShow me all possibilities of something

I All permutations of the numbers 1 to 10I Print all games of Party Pong (hard problem from previous

year)

Search ProblemsShow me whether something exists and how its put together

I Does a number exist in an array?I Does a path exist from point M to point C on a grid and what

is it?

|||||||||||||||||||||||||M || || || || C||||| || | || | | | || || | |||||||||||||||||||||||||

Page 13: CS 211: Recursion

Exercise: Sums

I Print all permutations of positive numberswhich total 8 (order of numbers matters)

I Create a recursive helper calledtotalsTarget()

I Base and recursive cases?

Prototypes

public static void sumsTo8(){..}

public staticvoid totalsTarget(int target,

int current,String history)

target: Eight!current: current totalhistory: numbers used so far

Example output

> javac Sums.java> java Sums8 = 1 1 1 1 1 1 1 18 = 1 1 1 1 1 1 28 = 1 1 1 1 1 2 18 = 1 1 1 1 1 38 = 1 1 1 1 2 1 1..8 = 6 1 18 = 6 28 = 7 18 = 8

I 128 lines. . .I Iterative version?

Page 14: CS 211: Recursion

The "Power" of Recursion

QuestionsI What problems can one solve with Recursion that cannot be

solved with iteration (looping)I Vice versa: loops can, recursion can’t?

Page 15: CS 211: Recursion

Stacks and Stacks of. . .

I We will shortly examine asolution to the sums problemwhich does not use recursion

I For that, we will need a datastructure: a stack

I Should be familiar at thispoint based on ourdiscussions of function callstack

I Subject of implementation inProject 6: AStack

Page 16: CS 211: Recursion

Stacks

A data structure, supports a fewoperations

I T s.getTop(): returnwhatever is on top

I s.push(T x): put x on topI void s.pop(): remove

whatever is on topI boolean s.isEmpty():

true when nothing is in it,false o/w

Stacks are a LIFO:Last In First Out

Questions

I Examples of stacks?I How would you implement a stack using arrays?

Page 17: CS 211: Recursion

Array Based Implementation of StacksI Similar to ArrayList, subject of P6 implementationI Must dynamically expand an internal arrayI Following the textbook ArrayList implementation should

make this easyI Can check your work against java.util.Stack: should

behave similarly

class AStack<T>{public AStack(); // Constructorpublic void push(T x); // Like add(x)public T pop(); // Like remove(size()-1)public T top(); // Like get(size()-1)// peek() is often a synonym for top()public int size();public int getCapacity();

}

Page 18: CS 211: Recursion

Sums to 8 - No RecursionConsider again thesums-to-8 problem

> javac Sums.java> java Sums8 = 1 1 1 1 1 1 1 18 = 1 1 1 1 1 1 28 = 1 1 1 1 1 2 18 = 1 1 1 1 1 38 = 1 1 1 1 2 1 1..8 = 6 1 18 = 6 28 = 7 18 = 8

Use stacks to get the following

cur: 0 hist: ’’ toAdd: [8, 7, 6, 5, 4, 3, 2, 1]cur: 1 hist: ’ 1’ toAdd: [7, 6, 5, 4, 3, 2, 1]cur: 2 hist: ’ 1 1’ toAdd: [6, 5, 4, 3, 2, 1]cur: 3 hist: ’ 1 1 1’ toAdd: [5, 4, 3, 2, 1]cur: 4 hist: ’ 1 1 1 1’ toAdd: [4, 3, 2, 1]cur: 5 hist: ’ 1 1 1 1 1’ toAdd: [3, 2, 1]cur: 6 hist: ’ 1 1 1 1 1 1’ toAdd: [2, 1]cur: 7 hist: ’ 1 1 1 1 1 1 1’ toAdd: [1]cur: 8 hist: ’ 1 1 1 1 1 1 1 1’ toAdd: []8 = 1 1 1 1 1 1 1 1cur: 7 hist: ’ 1 1 1 1 1 1 1’ toAdd: []cur: 6 hist: ’ 1 1 1 1 1 1’ toAdd: [2]cur: 8 hist: ’ 1 1 1 1 1 1 2’ toAdd: []8 = 1 1 1 1 1 1 2......8 = 6 2cur: 6 hist: ’ 6’ toAdd: []cur: 0 hist: ’’ toAdd: [8, 7]cur: 7 hist: ’ 7’ toAdd: [1]cur: 8 hist: ’ 7 1’ toAdd: []8 = 7 1

Page 19: CS 211: Recursion

Iterative Solutions

Use a little class to "simulate" a recursive call stack.

public static void totalsTarget(int target){Stack<SumFrame> stack = new Stack<SumFrame>();SumFrame first = new SumFrame(0,target,"");stack.push(first);

// Simulate the recursive call stack with a loopwhile(stack.size() > 0){

SumFrame frame = stack.peek();

Store info about what should be done at each step in those frames

class SumFrame{public int current; // Current sumpublic Stack<Integer> toAdd; // Numbers remaining to addpublic String history; // History of adds that led here

Solution in SumsNoRecursion.java