48
Recursion Lecture 14

Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Embed Size (px)

Citation preview

Page 1: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Recursion

Lecture 14

Page 2: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Announcements for Today

Prelim 1

• Tonight at 5:15 OR 7:30§ A–D (5:15, Uris G01)§ E-K (5:15, Statler)§ L–P (7:30, Uris G01)§ Q-Z (7:30, Statler)

• Graded by noon on Sun§ Scores will be in CMS§ In time for drop date

Other Announcements

• Reading: 5.8 – 5.10• Assignment 3 now graded

§ Mean 93.4, Median 98§ Time: 7 hrs, StdDev: 3.5 hrs§ But only 535 responses

• Assignment 4 posted Friday§ Parts 1-3: Can do already§ Part 4: material from today§ Due two weeks from today

10/11/18 Recursion 2

Page 3: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Recursion

• Recursive Definition: A definition that is defined in terms of itself

• Recursive Function: A function that calls itself (directly or indirectly)

PIP stands for “PIP Installs Packages”

10/11/18 Recursion 3

Page 4: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

A Mathematical Example: Factorial

• Non-recursive definition:n! = n� n-1 �… � 2 � 1

= n (n-1 �… � 2 � 1)

• Recursive definition:n! = n (n-1)!0! = 1

10/11/18 Recursion 4

for n ≥ 0 Recursive caseBase case

What happens if there is no base case?

Page 5: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Factorial as a Recursive Function

def factorial(n):"""Returns: factorial of n.Pre: n ≥ 0 an int"""if n == 0:

return 1

return n*factorial(n-1)

• n! = n (n-1)!• 0! = 1

10/11/18 Recursion 5

What happens if there is no base case?

Recursive case

Base case(s)

Page 6: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Example: Fibonnaci Sequence

• Sequence of numbers: 1, 1, 2, 3, 5, 8, 13, ...a0 a1 a2 a3 a4 a5 a6

§ Get the next number by adding previous two§ What is a8?

10/11/18 Recursion 6

A: a8 = 21B: a8 = 29C: a8 = 34D: None of these.

Page 7: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Example: Fibonnaci Sequence

• Sequence of numbers: 1, 1, 2, 3, 5, 8, 13, ...a0 a1 a2 a3 a4 a5 a6

§ Get the next number by adding previous two§ What is a8?

10/11/18 Recursion 7

A: a8 = 21B: a8 = 29C: a8 = 34D: None of these.

correct

Page 8: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Example: Fibonnaci Sequence

• Sequence of numbers: 1, 1, 2, 3, 5, 8, 13, ...a0 a1 a2 a3 a4 a5 a6

§ Get the next number by adding previous two§ What is a8?

• Recursive definition:§ an = an-1 + an-2 Recursive Case§ a0 = 1 Base Case§ a1 = 1 (another) Base Case

10/11/18 Recursion 8

Why did we need two base cases this time?

Page 9: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Fibonacci as a Recursive Function

def fibonacci(n):"""Returns: Fibonacci no. an

Precondition: n ≥ 0 an int"""if n <= 1:

return 1

return (fibonacci(n-1)+fibonacci(n-2))

10/11/18 Recursion 9

Recursive case

Base case(s)

Note difference with base case conditional.

Page 10: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Fibonacci as a Recursive Function

def fibonacci(n):"""Returns: Fibonacci no. an

Precondition: n ≥ 0 an int"""if n <= 1:

return 1

return (fibonacci(n-1)+fibonacci(n-2))

• Function that calls itself§ Each call is new frame§ Frames require memory§ ∞ calls = ∞ memory

10/11/18 Recursion 10

n

fibonacci 3

5

n

fibonacci 1

4 n

fibonacci 1

3

Page 11: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Fibonacci: # of Frames vs. # of Calls

• Fibonacci is very inefficient.§ fib(n) has a stack that is always ≤ n§ But fib(n) makes a lot of redundant calls

fib(5)

fib(4)

fib(3) fib(2)

fib(2) fib(1) fib(0)

fib(0)

fib(1)

fib(1)11Recursion

fib(3)

fib(2) fib(1)

fib(0)fib(1)

10/11/18

Page 12: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Fibonacci: # of Frames vs. # of Calls

• Fibonacci is very inefficient.§ fib(n) has a stack that is always ≤ n§ But fib(n) makes a lot of redundant calls

fib(5)

fib(4)

fib(3) fib(2)

fib(2) fib(1) fib(0)

fib(0)

fib(1)

fib(1)12Recursion

fib(3)

fib(2) fib(1)

fib(0)fib(1)

Path to end = the call stack

10/11/18

Page 13: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Recursion vs Iteration

• Recursion is provably equivalent to iteration§ Iteration includes for-loop and while-loop (later)§ Anything can do in one, can do in the other

• But some things are easier with recursion§ And some things are easier with iteration

• Will not teach you when to choose recursion§ This is a topic for more advanced classes

• We just want you to understand the technique10/11/18 Recursion 13

Page 14: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Recursion is best for Divide and Conquer

Goal: Solve problem P on a piece of data

10/11/18 Recursion 14

data

Page 15: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Recursion is best for Divide and Conquer

Goal: Solve problem P on a piece of data

10/11/18 Recursion 15

dataIdea: Split data into two parts and solve problem

data 1 data 2

Solve Problem P Solve Problem P

Page 16: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Recursion is best for Divide and Conquer

Goal: Solve problem P on a piece of data

10/11/18 Recursion 16

dataIdea: Split data into two parts and solve problem

data 1 data 2

Solve Problem P Solve Problem P

Combine Answer!

Page 17: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Example

Count the number of 'e's in a string:

10/11/18 Recursion 17

p e nn e

Two 'e's

p e nn e

One 'e' One 'e'

Page 18: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Example

Count the number of 'e's in a string:

10/11/18 Recursion 18

p e nn e

Two 'e's

p e nn e

Zero 'e's Two 'e's

Page 19: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Example

Count the number of 'e's in a string:

10/11/18 Recursion 19

p e nn e

Two 'e's

p e nn e

Zero 'e's Two 'e's

Will talk about how to break-up later

Page 20: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Three Steps for Divide and Conquer

1. Decide what to do on “small” data§ Some data cannot be broken up§ Have to compute this answer directly

2. Decide how to break up your data§ Both “halves” should be smaller than whole§ Often no wrong way to do this (next lecture)

3. Decide how to combine your answers§ Assume the smaller answers are correct§ Combining them should give bigger answer

10/11/18 Recursion 20

Page 21: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Exampledef num_es(s):

"""Returns: # of 'e's in s"""# 1. Handle small dataif s == '':

return 0elif len(s) == 1:

return 1 if s[0] == 'e' else 0

# 2. Break into two partsleft = num_es(s[0])right = num_es(s[1:])

# 3. Combine the resultreturn left+right

“Short-cut” forif s[0] == 'e’:

return 1else:

return 0

10/11/18 Recursion 21

p e nn e

0 2+

s[0] s[1:]

Page 22: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Exampledef num_es(s):

"""Returns: # of 'e's in s"""# 1. Handle small dataif s == '':

return 0elif len(s) == 1:

return 1 if s[0] == 'e' else 0

# 2. Break into two partsleft = num_es(s[0])right = num_es(s[1:])

# 3. Combine the resultreturn left+right

“Short-cut” forif s[0] == 'e’:

return 1else:

return 0

10/11/18 Recursion 22

p e nn e

0 2+

s[0] s[1:]

Page 23: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Exampledef num_es(s):

"""Returns: # of 'e's in s"""# 1. Handle small dataif s == '':

return 0elif len(s) == 1:

return 1 if s[0] == 'e' else 0

# 2. Break into two partsleft = num_es(s[0])right = num_es(s[1:])

# 3. Combine the resultreturn left+right

“Short-cut” forif s[0] == 'e’:

return 1else:

return 0

10/11/18 Recursion 23

p e nn e

0 2+

s[0] s[1:]

Page 24: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Exampledef num_es(s):

"""Returns: # of 'e's in s"""# 1. Handle small dataif s == '':

return 0elif len(s) == 1:

return 1 if s[0] == 'e' else 0

# 2. Break into two partsleft = num_es(s[0])right = num_es(s[1:])

# 3. Combine the resultreturn left+right

“Short-cut” forif s[0] == 'e’:

return 1else:

return 0

10/11/18 Recursion 24

p e nn e

0 2+

s[0] s[1:]

Page 25: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Divide and Conquer Exampledef num_es(s):

"""Returns: # of 'e's in s"""# 1. Handle small dataif s == '':

return 0elif len(s) == 1:

return 1 if s[0] == 'e' else 0

# 2. Break into two partsleft = num_es(s[0])right = num_es(s[1:])

# 3. Combine the resultreturn left+right

10/11/18 Recursion 25

Base Case

RecursiveCase

Page 26: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Exercise: Remove Blanks from a String

def deblank(s):"""Returns: s but with its blanks removed"""

1. Decide what to do on “small” data§ If it is the empty string, nothing to do

if s == '':return s

§ If it is a single character, delete it if a blankif s == ' ': # There is a space here

return '' # Empty stringelse:

return s10/11/18 Recursion 26

Page 27: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Exercise: Remove Blanks from a String

def deblank(s):"""Returns: s but with its blanks removed"""

2. Decide how to break it upleft = deblank(s[0]) # A string with no blanksright = deblank(s[1:]) # A string with no blanks

3. Decide how to combine the answerreturn left+right # String concatenation

10/11/18 Recursion 27

Page 28: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Putting it All Together

def deblank(s):"""Returns: s w/o blanks"""if s == '':

return selif len(s) == 1:

return '' if s[0] == ' ' else s

left = deblank(s[0])right = deblank(s[1:])

return left+right

10/11/18 Recursion 28

Handle small data

Break up the data

Combine answers

Page 29: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Putting it All Together

def deblank(s):"""Returns: s w/o blanks"""if s == '':

return selif len(s) == 1:

return '' if s[0] == ' ' else s

left = deblank(s[0])right = deblank(s[1:])

return left+right

10/11/18 Recursion 29

Base Case

RecursiveCase

Page 30: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Minor Optimization

def deblank(s):"""Returns: s w/o blanks"""if s == '':

return selif len(s) == 1:

return '' if s[0] == ' ' else s

left = deblank(s[0])right = deblank(s[1:])

return left+right

10/11/18 Recursion 30

Needed secondbase case to handle s[0]

Page 31: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Minor Optimization

def deblank(s):"""Returns: s w/o blanks"""if s == '':

return s

left = s[0]if s[0] == ' ':

left = ''right = deblank(s[1:])

return left+right

10/11/18 Recursion 31

Eliminate the second base

by combining

Less recursive calls

Page 32: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b cdeblank

10/11/18 Recursion 32

Page 33: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b cdeblank

a b cdeblank

10/11/18 Recursion 33

Page 34: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

deblank

a b cdeblank

b cdeblank

10/11/18 Recursion 34

Page 35: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

deblank

a b cdeblank

b cdeblank

b cdeblank

10/11/18 Recursion 35

Page 36: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

10/11/18 Recursion 36

Page 37: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

10/11/18 Recursion 37

Page 38: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

c10/11/18 Recursion 38

Page 39: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

c c10/11/18 Recursion 39

Page 40: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

c c

c✗10/11/18 Recursion 40

Page 41: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

c c

c✗cb

10/11/18 Recursion 41

Page 42: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

c c

c✗cb

cb✗

10/11/18 Recursion 42

Page 43: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

c c

c✗cb

cb✗cba

10/11/18 Recursion 43

Page 44: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

c c

c✗cb

cb✗cba

cba✗

10/11/18 Recursion 44

Page 45: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Following the Recursion

a b c

a

b

c c

c

cb

cb

cba

cba

cba

deblank

a b cdeblank

b cdeblank

b cdeblank

cdeblank

cdeblank

10/11/18 Recursion 45

Page 46: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Final Modification

def deblank(s):"""Returns: s w/o blanks"""if s == '':

return s

left = s[0]if s[0] == ' ':

left = ''right = deblank(s[1:])

return left+right

10/11/18 Recursion 46

Real work done here

Page 47: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Final Modification

def deblank(s):"""Returns: s w/o blanks"""if s == '':

return s

left = sif s[0] in string.whitespace

left = ''right = deblank(s[1:])

return left+right

10/11/18 Recursion 47

Module string has special constants to simplify

detection of whitespace and other characters.

Real work done here

Page 48: Recursion - cs.cornell.edu · Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can

Next Time: Breaking Up Recursion

10/11/18 Recursion 48