recursion - cs.cornell.edu...recursion vs iteration •recursionis provably equivalentto iteration...
TRANSCRIPT
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/1.jpg)
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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/2.jpg)
Announcements for Today
Prelim 1
• Tonight at 7:30 pm§ A–F in Uris G01§ G-H in Malott 228§ I–L in Ives 305§ M-Z in Statler Aud.
• 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.6, Median 98§ Time: 7.1 hr, StdDev: 3.3 hr§ But only 552 responses
• Assignment 4 posted Friday§ Parts 1-3: Can do already§ Part 4: material from today§ Due 2 weeks from yesterday
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/3.jpg)
So You Want to be a Consultant
• Applications are now open for Spring semester§ https://www.cs.cornell.edu/undergrad/ugradcoursestaff§ Applications close October 31
• CS 1110 will not do much hiring this year§ Already have a large course staff§ There will be less students in the Spring
• But CS 1133 (Short Course) is hiring!§ Decided to give it dedicated staff§ If you can get an A on prelim 1, good enough
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/4.jpg)
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/17/19 Recursion 4
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/5.jpg)
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/17/19 Recursion 5
for n > 0 Recursive caseBase case
What happens if there is no base case?
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/6.jpg)
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/17/19 Recursion 6
What happens if there is no base case?
Recursive case
Base case(s)
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/7.jpg)
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/17/19 Recursion 7
A: a8 = 21B: a8 = 29C: a8 = 34D: None of these.
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/8.jpg)
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/17/19 Recursion 8
A: a8 = 21B: a8 = 29C: a8 = 34D: None of these.
correct
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/9.jpg)
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/17/19 Recursion 9
Why did we need two base cases this time?
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/10.jpg)
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/17/19 Recursion 10
Recursive case
Base case(s)
Note difference with base case conditional.
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/11.jpg)
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/17/19 Recursion 11
n
fibonacci 3
5
n
fibonacci 1
4 n
fibonacci 1
3
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/12.jpg)
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)
10/17/19
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/13.jpg)
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)13Recursion
fib(3)
fib(2) fib(1)
fib(0)fib(1)
Path to end = the call stack
10/17/19
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/14.jpg)
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/17/19 Recursion 14
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/15.jpg)
Recursion is best for Divide and Conquer
Goal: Solve problem P on a piece of data
10/17/19 Recursion 15
data
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/16.jpg)
Recursion is best for Divide and Conquer
Goal: Solve problem P on a piece of data
10/17/19 Recursion 16
dataIdea: Split data into two parts and solve problem
data 1 data 2
Solve Problem P Solve Problem P
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/17.jpg)
Recursion is best for Divide and Conquer
Goal: Solve problem P on a piece of data
10/17/19 Recursion 17
dataIdea: Split data into two parts and solve problem
data 1 data 2
Solve Problem P Solve Problem P
Combine Answer!
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/18.jpg)
Divide and Conquer Example
Count the number of 'e's in a string:
10/17/19 Recursion 18
p e nn e
Two 'e's
p e nn e
One 'e' One 'e'
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/19.jpg)
Divide and Conquer Example
Count the number of 'e's in a string:
10/17/19 Recursion 19
p e nn e
Two 'e's
p e nn e
Zero 'e's Two 'e's
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/20.jpg)
Divide and Conquer Example
Count the number of 'e's in a string:
10/17/19 Recursion 20
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 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/21.jpg)
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/17/19 Recursion 21
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/22.jpg)
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/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/23.jpg)
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/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/24.jpg)
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/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/25.jpg)
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/17/19 Recursion 25
p e nn e
0 2+
s[0] s[1:]
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/26.jpg)
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/17/19 Recursion 26
Base Case
RecursiveCase
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/27.jpg)
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/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/28.jpg)
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/17/19 Recursion 28
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/29.jpg)
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/17/19 Recursion 29
Handle small data
Break up the data
Combine answers
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/30.jpg)
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/17/19 Recursion 30
Base Case
RecursiveCase
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/31.jpg)
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/17/19 Recursion 31
Needed secondbase case to handle s[0]
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/32.jpg)
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/17/19 Recursion 32
Eliminate the second base
by combining
Less recursive calls
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/33.jpg)
Following the Recursion
a b cdeblank
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/34.jpg)
Following the Recursion
a b cdeblank
a b cdeblank
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/35.jpg)
Following the Recursion
a b c
a
deblank
a b cdeblank
b cdeblank
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/36.jpg)
Following the Recursion
a b c
a
deblank
a b cdeblank
b cdeblank
b cdeblank
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/37.jpg)
Following the Recursion
a b c
a
b
deblank
a b cdeblank
b cdeblank
b cdeblank
cdeblank
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/38.jpg)
Following the Recursion
a b c
a
b
deblank
a b cdeblank
b cdeblank
b cdeblank
cdeblank
cdeblank
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/39.jpg)
Following the Recursion
a b c
a
b
deblank
a b cdeblank
b cdeblank
b cdeblank
cdeblank
cdeblank
c10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/40.jpg)
Following the Recursion
a b c
a
b
deblank
a b cdeblank
b cdeblank
b cdeblank
cdeblank
cdeblank
c c10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/41.jpg)
Following the Recursion
a b c
a
b
deblank
a b cdeblank
b cdeblank
b cdeblank
cdeblank
cdeblank
c c
c✗10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/42.jpg)
Following the Recursion
a b c
a
b
deblank
a b cdeblank
b cdeblank
b cdeblank
cdeblank
cdeblank
c c
c✗cb
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/43.jpg)
Following the Recursion
a b c
a
b
deblank
a b cdeblank
b cdeblank
b cdeblank
cdeblank
cdeblank
c c
c✗cb
cb✗
10/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/44.jpg)
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/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/45.jpg)
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/17/19 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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/46.jpg)
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/17/19 Recursion 46
![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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/47.jpg)
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/17/19 Recursion 47
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](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/48.jpg)
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/17/19 Recursion 48
Module string has special constants to simplify
detection of whitespace and other characters.
Real work done here
![Page 49: Recursion - cs.cornell.edu...Recursion vs Iteration •Recursionis provably equivalentto iteration §Iteration includes for-loopand while-loop(later) §Anything can do in one, can](https://reader033.vdocument.in/reader033/viewer/2022052010/6020505561230c407172a69e/html5/thumbnails/49.jpg)
Next Time: Breaking Up Recursion
10/17/19 Recursion 49