1 CSE1301 Computer Programming Lecture 28 Recursion (Part 2)
Lecture 07 A First Look at Recursion
Transcript of Lecture 07 A First Look at Recursion
![Page 1: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/1.jpg)
Lecture 07A First Look at Recursion
It’s a baby holding a smaller baby! If that ain’t recursion idk what is. Oh wait.. I don’t know what recursion is…. what’s that?
based in part on notes from the CS-for-All curriculum developed at Harvey Mudd College and Boston University 1
![Page 2: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/2.jpg)
Last Time (lecture 06)
2
• Methods (functions attached to objects)• string.lower()• file.close()
• File Processing• Opening and Closing Text-based Files• Reading 1 line vs. whole file
• Splitting strings• s.split() # for whitespace• s.split(‘,’) # for CSV files
• Dictionaries• data = {'key1': value1, 'key2': value2}• data[key1] = value1
• Markov models and Project 1• due Thursday, Feb. 28 @ midnight
![Page 3: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/3.jpg)
Lecture 07 Goals
3
1. Introduce recursion design processa. function calling itself!
2. Application of Test Driven Design (TDD) to recursion
3. As time allows:a. lambda functionsb. filter, map, & reducec. debugging using pdb (Python debugger)
![Page 4: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/4.jpg)
Remember this slide?
def fac(n): if n == 0: return 1 else: rest = fac(n-1) return n * rest
def fac(n): result = 1 for x in range(1, n+1): result *= x return result
def fac(n): return reduce(lambda x,y : x*y,\ range(1,max(2,n+1)))
map
recursion for loop
def fac(n): result = 1 while n > 0: result *= n n = n - 1 return result
while loop
4
More on these later! RIGHT NOW!
![Page 5: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/5.jpg)
Functions Calling Themselves: Recursion!
def fac(n): if n <= 1: return 1 else: return n * fac(n – 1)
• Recursion solves a problem by reducing itto a simpler or smaller problem of the same kind.
• the function calls itself to solve the smaller problem!
• We take advantage of recursive substructure.
• the fact that we can define the problem in terms of itself
n! = n * (n-1)!
5
Remember this function? factorial?
![Page 6: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/6.jpg)
Functions Calling Themselves: Recursion! (cont.)
def fac(n): if n <= 1: return 1 else: return n * fac(n – 1)
• One recursive call leads to another...fac(5) = 5 * fac(4) = 5 * 4 * fac(3) = ...
• We eventually reach a problem that is small enough to be solved directly – a base case.
• stops the recursion
• make sure that you always include one!
base case
recursive case
6
![Page 7: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/7.jpg)
Recursion Without a Base Case – infinite loop!
http://blog.stevemould.com/the-droste-effect-image-recursion/ 7
![Page 8: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/8.jpg)
fac(5)
5 * fac(4)
4 * fac(3)
3 * fac(2)
2 * fac(1)
1
the stack
remembers all of the
individual calls to fac
and their variables
def fac(n):
if n <= 1: return 1
else: return n * fac(n-1)
n=5
n=4
n=3
n=2
n=1
5 different n's are
living in memory…
5 *
5 * 4 *
5 * 4 * 3 *
5 * 4 * 3 * 2 * 8
![Page 9: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/9.jpg)
fac(5)
5 * fac(4)
4 * fac(3)
3 * fac(2)
2 * 1
def fac(n):
if n <= 1: return 1
else: return n * fac(n-1)
5 *
5 * 4 *
5 * 4 * 3 *
The final result gets built up on the way back from the base case!
15 * 4 * 3 * 2 * 9
![Page 10: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/10.jpg)
fac(5)
5 * fac(4)
4 * fac(3)
3 * fac(2)
2 * 1
def fac(n):
if n <= 1: return 1
else: return n * fac(n-1)
5 *
5 * 4 *
5 * 4 * 3 *
The final result gets built up on the way back from the base case!
10
![Page 11: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/11.jpg)
fac(5)
5 * fac(4)
4 * fac(3)
3 * 2
def fac(n):
if n <= 1: return 1
else: return n * fac(n-1)
5 *
5 * 4 *
The final result gets built up on the way back from the base case!
11
![Page 12: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/12.jpg)
fac(5)
5 * fac(4)
4 * 6
def fac(n):
if n <= 1: return 1
else: return n * fac(n-1)
5 *
The final result gets built up on the way back from the base case!
12
![Page 13: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/13.jpg)
fac(5)
5 * 24
def fac(n):
if n <= 1: return 1
else: return n * fac(n-1)
The final result gets built up on the way back from the base case!
13
![Page 14: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/14.jpg)
fac(5)
result: 120
def fac(n):
if n <= 1: return 1
else: return n * fac(n-1)
14
![Page 15: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/15.jpg)
Alternative Version of fac(n)
def fac(n): if n <= 1: return 1
else: rest = fac(n – 1)
return n * rest
• Storing the result of the recursive call will occasionallymake the problem easier to solve.
• It also makes your recursive functions easier to trace and debug.
• We highly recommend that you take this approach when debugging!
15
![Page 16: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/16.jpg)
def fac(n): if n <= 1: return 1 else: rest = fac(n-1) return n * rest
You handle the base case – the easiest case!
Recursion does almost all of the
rest of the problem!
You specify one step
at the end.
Let Recursion Do the Work For You!
16
![Page 17: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/17.jpg)
Recursively Processing a List or String• You can think about (and process) sequences recursively!
• a string is a character followed by a string...
• a list is an element followed by a list...
• Let s be the sequence (string or list) that we're processing.
• Do one step!
• use s[0] to access the initial element
• do something with it
• Delegate the rest!
• use s[1:] to get the rest of the sequence.
• make a recursive call to process it!
17
![Page 18: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/18.jpg)
Recursively Finding the Length of a String
def mylen(s): """ returns the number of characters in s input s: an arbitrary string """ if s == '': # base case
else: # recursive case
• Ask yourself:
When can I determine the length of s withoutlooking at a smaller string?
How could I use the length of anything smaller than s to determine the length of s?
(base case)
(recursivesubstructure)
18
![Page 19: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/19.jpg)
Recursively Finding the Length of a String
def mylen(s): """ returns the number of characters in s input s: an arbitrary string """ if s == '': # base case return 0
else: # recursive case len_rest = mylen(s[1:]) return len_rest + 1
• Ask yourself:
When can I determine the length of s withoutlooking at a smaller string?
How could I use the length of anything smaller than s to determine the length of s?
(base case)
(recursivesubstructure)
19
![Page 20: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/20.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow')
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ow') s = 'ow' len_rest = mylen('w')
mylen('w') s = 'w' len_rest = mylen('')
mylen('') s = '' base case! return 0
4 differentstack frames,each with its own s and len_rest
20
![Page 21: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/21.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow')
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ow') s = 'ow' len_rest = mylen('w')
mylen('w') s = 'w' len_rest = mylen('') = 0
mylen('') s = '' base case! return 0
4 differentstack frames,each with its own s and len_rest
21
![Page 22: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/22.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow')
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ow') s = 'ow' len_rest = mylen('w')
mylen('w') s = 'w' len_rest = mylen('') = 0 return 0 + 1 = 1
len_rest
The final result gets built up on the way back from the base case!
22
![Page 23: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/23.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow')
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ow') s = 'ow' len_rest = mylen('w') = 1
mylen('w') s = 'w' len_rest = mylen('') = 0 return 0 + 1 = 1
The final result gets built up on the way back from the base case!
23
![Page 24: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/24.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow')
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ow') s = 'ow' len_rest = mylen('w') = 1 return 1 + 1 = 2
The final result gets built up on the way back from the base case!
24
![Page 25: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/25.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow') = 2
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ow') s = 'ow' len_rest = mylen('w') = 1 return 1 + 1 = 2
The final result gets built up on the way back from the base case!
25
![Page 26: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/26.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow') = 2 return 2 + 1 = 3
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
The final result gets built up on the way back from the base case!
26
![Page 27: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/27.jpg)
mylen('wow') s = 'wow' len_rest = mylen('ow') = 2 return 2 + 1 = 3
How recursion works...def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
result: 3
27
![Page 28: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/28.jpg)
How many times will mylen() be called?
def mylen(s): if s == '': # base case return 0 else: # recursive case
len_rest = mylen(s[1:]) return len_rest + 1
print(mylen('step'))
A. 1 B. 3 C. 4D. 5E. 6
28
![Page 29: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/29.jpg)
How many times will mylen() be called?
def mylen(s): if s == '': # base case return 0 else: # recursive case
len_rest = mylen(s[1:]) return len_rest + 1
print(mylen('step'))
A. 1 B. 3 C. 4D. 5E. 6
29
![Page 30: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/30.jpg)
mylen('tep') s = 'tep' len_rest = mylen('ep')
def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ep') s = 'ep' len_rest = mylen('p')
mylen('p') s = 'p' len_rest = mylen('')
mylen('') s = '' base case! return 0
5 differentstack frames,each with its own s and len_rest
mylen('step') s = 'step' len_rest = mylen('tep')
30
![Page 31: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/31.jpg)
mylen('tep') s = 'tep' len_rest = mylen('ep')
def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ep') s = 'ep' len_rest = mylen('p')
mylen('p') s = 'p' len_rest = mylen('') = 0
mylen('') s = '' base case! return 0
mylen('step') s = 'step' len_rest = mylen('tep')
31
![Page 32: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/32.jpg)
mylen('tep') s = 'tep' len_rest = mylen('ep')
def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ep') s = 'ep' len_rest = mylen('p') = 1
mylen('p') s = 'p' len_rest = mylen('') = 0 return 0 + 1 = 1
mylen('step') s = 'step' len_rest = mylen('tep')
len_rest
The final result gets built up on the way back from the base case!
32
![Page 33: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/33.jpg)
mylen('tep') s = 'tep' len_rest = mylen('ep') = 2
def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('ep') s = 'ep' len_rest = mylen('p') = 1 return 1 + 1 = 2
mylen('step') s = 'step' len_rest = mylen('tep')
The final result gets built up on the way back from the base case!
len_rest
33
![Page 34: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/34.jpg)
mylen('tep') s = 'tep' len_rest = mylen('ep') = 2 return 2 + 1 = 3
def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('step') s = 'step' len_rest = mylen('tep') = 3
The final result gets built up on the way back from the base case!
len_rest
34
![Page 35: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/35.jpg)
def mylen(s): if s == '': return 0 else: len_rest = mylen(s[1:]) return len_rest + 1
mylen('step') s = 'step' len_rest = mylen('tep') = 3 return 3 + 1 = 4
The final result gets built up on the way back from the base case!
result: 4
35
![Page 36: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/36.jpg)
What is the output of this program?
def foo(x, y): if x <= y: return y else: return x + foo(x – 2, y + 1)
print(foo(9, 2))
A. 2 B. 4 C. 5D. 21E. 26
36
![Page 37: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/37.jpg)
What is the output of this program?
def foo(x, y): if x <= y: return y else: return x + foo(x – 2, y + 1)
print(foo(9, 2))
A. 2 B. 4 C. 5D. 21E. 26
37
![Page 38: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/38.jpg)
foo(9, 2)
How recursion works... def foo(x, y): if x <= y: return y else: return x + foo(x-2, y+1)
9 + foo(7, 3)
9 + 7 + foo(5, 4)
9 + 7 + 5 + foo(3, 5)
9 + 7 + 5 + 5
38
![Page 39: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/39.jpg)
foo(9, 2)
How recursion works... def foo(x, y): if x <= y: return y else: return x + foo(x-2, y+1)
9 + foo(7, 3)
9 + 7 + foo(5, 4)
9 + 7 + 5 + 5
The final result gets built up on the way back from the base case!
39
![Page 40: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/40.jpg)
foo(9, 2)
How recursion works... def foo(x, y): if x <= y: return y else: return x + foo(x-2, y+1)
9 + foo(7, 3)
9 + 7 + 10
The final result gets built up on the way back from the base case!
40
![Page 41: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/41.jpg)
foo(9, 2)
How recursion works... def foo(x, y): if x <= y: return y else: return x + foo(x-2, y+1)
9 + 17 The final result gets built up on the way back from the base case!
41
![Page 42: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/42.jpg)
foo(9, 2)
How recursion works... def foo(x, y): if x <= y: return y else: return x + foo(x-2, y+1)
result: 26
42
![Page 43: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/43.jpg)
Designing a Recursive Function1. Use Test Driven Design and then
2. Start by programming the base case(s) and testing.
• What instance(s) of this problem can I solve directly (without looking at anything smaller)?
3. Find the recursive substructure.
• How could I use the solution to any smaller version of the problem to solve the overall problem?
4. Do one step!
5. Delegate the rest to recursion!
43
![Page 44: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/44.jpg)
A Recursive Function for Counting Vowelsdef num_vowels(s): """ returns the number of vowels in s input s: a string of lowercase letters """ # We'll design this together!
• Examples of how it should work:
>>> num_vowels('compute') 3 >>> num_vowels('now') 1
• The in operator will be helpful:
>>> 'fun' in 'function' True >>> 'i' in 'team' False
44
![Page 45: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/45.jpg)
Test Driven Design Steps
1. Inputs/Outputs, special cases
2. Function signature
3. Design test cases, then code function
4. Refined testing as coding proceeds
45
![Page 46: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/46.jpg)
Test Driven Design Steps
1. Inputs/Outputs, Special Cases
Returns number of vowels in a string argument• s empty, i.e. s=‘’• s with one vowel• s with more than one vowel• s with vowel at beginning or end
2. Function Signature
def num_vowels(s): """ returns the number of vowels in s input s: a string of lowercase letters """
3. Test Cases
46
![Page 47: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/47.jpg)
Design Questions for num_vowels()When can I determine the # of vowels in s without
looking at a smaller string?
How could I use the solution to anything smaller than s to determine the solution to s?
aliens rejoice
(base case)
(recursivesubstructure)
You can only see the firstletter of this string.If I told you the # of vowels in the covered portion, how would you determine the total number of vowels?
What about this string?
42
47
![Page 48: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/48.jpg)
Design Questions for num_vowels()When can I determine the # of vowels in s without
looking at a smaller string?
How could I use the solution to anything smaller than s to determine the solution to s?
aliens rejoice
(base case)
(recursivesubstructure)
You can only see the firstletter of this string.If I told you the # of vowels in the covered portion, how would you determine the total number of vowels?
What about this string?
1 + (# in covered)
0 + (# in covered)
The recursive call gives us (# in covered)!!!48
![Page 49: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/49.jpg)
How Many Lines of This Function Have a Bug?def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[0:]) if s[0] in 'aeiou': return 1 else:
return 0
A. 0
B. 1
C. 2D. 3E. more than 3 49
![Page 50: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/50.jpg)
How Many Lines of This Function Have a Bug?def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else:
return 0 + rest
A. 0
B. 1
C. 2D. 3E. more than 3 50
![Page 51: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/51.jpg)
num_vowels('ate') s = 'ate' rest = num_vowels('te')
How recursion works...def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else: return 0 + restnum_vowels('te')
s = 'te' rest = num_vowels('e')
num_vowels('e') s = 'e' rest = num_vowels('')
num_vowels('') s = '' base case! return 0
4 differentstack frames,each with its own s and rest
51
![Page 52: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/52.jpg)
num_vowels('ate') s = 'ate' rest = num_vowels('te')
How recursion works...def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else: return 0 + restnum_vowels('te')
s = 'te' rest = num_vowels('e')
num_vowels('e') s = 'e' rest = num_vowels('') = 0
num_vowels('') s = '' base case! return 0
4 differentstack frames,each with its own s and rest
52
![Page 53: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/53.jpg)
num_vowels('ate') s = 'ate' rest = num_vowels('te')
How recursion works...def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else: return 0 + restnum_vowels('te')
s = 'te' rest = num_vowels('e')
num_vowels('e') s = 'e' s[0] -> 'e' rest = num_vowels('') = 0 return 1 + 0 = 1
rest
The final result gets built up on the way back from the base case!
53
![Page 54: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/54.jpg)
num_vowels('ate') s = 'ate' rest = num_vowels('te')
How recursion works...def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else: return 0 + restnum_vowels('te')
s = 'te' rest = num_vowels('e') = 1
num_vowels('e') s = 'e' s[0] -> 'e' rest = num_vowels('') = 0 return 1 + 0 = 1
The final result gets built up on the way back from the base case!
54
![Page 55: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/55.jpg)
num_vowels('ate') s = 'ate' rest = num_vowels('te')
How recursion works...def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else: return 0 + restnum_vowels('te')
s = 'te' s[0] -> 't' rest = num_vowels('e') = 1 return 0 + 1 = 1
The final result gets built up on the way back from the base case!
55
![Page 56: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/56.jpg)
num_vowels('ate') s = 'ate' rest = num_vowels('te') = 1
How recursion works...def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else: return 0 + restnum_vowels('te')
s = 'te' s[0] -> 't' rest = num_vowels('e') = 1 return 0 + 1 = 1
The final result gets built up on the way back from the base case!
56
![Page 57: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/57.jpg)
num_vowels('ate') s = 'ate' s[0] -> 'a' rest = num_vowels('te') = 1 return 1 + 1 = 2
How recursion works...def num_vowels(s): if s == '': return 0 else: rest = num_vowels(s[1:]) if s[0] in 'aeiou': return 1 + rest else: return 0 + rest
result: 2
57
![Page 58: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/58.jpg)
Recursively Raising a Number to a Power
def power(b, p): """ returns b raised to the p power inputs: b is a number (int or float) p is a non-negative integer """ if # base case
else:
• Ask yourself:
When can I determine bp without determining a smaller power?
How could I use anything smaller than bp to determine bp?
(base case)
(recursivesubstructure) 58
![Page 59: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/59.jpg)
Recursively Raising a Number to a Power
def power(b, p): """ returns b raised to the p power inputs: b is a number (int or float) p is a non-negative integer """ if p == 0: # base case return 1
else: pow_rest = power(b, p-1) return b * pow_rest
• Ask yourself:
When can I determine bp without determining a smaller power?
How could I use anything smaller than bp to determine bp?
(base case)
(recursivesubstructure) 59
![Page 60: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/60.jpg)
power(3, 3) b = 3, p = 3 pow_rest = power(3, 2)
How recursion works...def power(b, p): if p == 0: return 1 else: pow_rest = power(b, p-1) return b * pow_rest
power(3, 2) b = 3, p = 2 pow_rest = power(3, 1)
power(3, 1) b = 3, p = 1 pow_rest = power(3, 0)
power(3, 0) b = 3, p = 0 base case! return 1
4 differentstack frames,each with its own b , p, and pow_rest
60
![Page 61: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/61.jpg)
power(3, 3) b = 3, p = 3 pow_rest = power(3, 2)
How recursion works...def power(b, p): if p == 0: return 1 else: pow_rest = power(b, p-1) return b * pow_rest
power(3, 2) b = 3, p = 2 pow_rest = power(3, 1)
power(3, 1) b = 3, p = 1 pow_rest = power(3, 0) = 1
power(3, 0) b = 3, p = 0 base case! return 1
4 differentstack frames,each with its own b , p, and pow_rest
61
![Page 62: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/62.jpg)
power(3, 3) b = 3, p = 3 pow_rest = power(3, 2)
How recursion works...def power(b, p): if p == 0: return 1 else: pow_rest = power(b, p-1) return b * pow_rest
power(3, 2) b = 3, p = 2 pow_rest = power(3, 1)
power(3, 1) b = 3, p = 1 pow_rest = power(3, 0) = 1 return 3 * 1 = 3
pow_restb
The final result gets built up on the way back from the base case!
62
![Page 63: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/63.jpg)
power(3, 3) b = 3, p = 3 pow_rest = power(3, 2)
How recursion works...def power(b, p): if p == 0: return 1 else: pow_rest = power(b, p-1) return b * pow_rest
power(3, 2) b = 3, p = 2 pow_rest = power(3, 1) = 3
power(3, 1) b = 3, p = 1 pow_rest = power(3, 0) = 1 return 3 * 1 = 3
The final result gets built up on the way back from the base case!
63
![Page 64: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/64.jpg)
power(3, 3) b = 3, p = 3 pow_rest = power(3, 2)
How recursion works...def power(b, p): if p == 0: return 1 else: pow_rest = power(b, p-1) return b * pow_rest
power(3, 2) b = 3, p = 2 pow_rest = power(3, 1) = 3 return 3 * 3 = 9
The final result gets built up on the way back from the base case!
64
![Page 65: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/65.jpg)
power(3, 3) b = 3, p = 3 pow_rest = power(3, 2) = 9
How recursion works...def power(b, p): if p == 0: return 1 else: pow_rest = power(b, p-1) return b * pow_rest
power(3, 2) b = 3, p = 2 pow_rest = power(3, 1) = 3 return 3 * 3 = 9
The final result gets built up on the way back from the base case!
65
![Page 66: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/66.jpg)
power(3, 3) b = 3, p = 3 pow_rest = power(3, 2) = 9 return 3 * 9 = 27
How recursion works...def power(b, p): if p == 0: return 1 else: pow_rest = power(b, p-1) return b * pow_rest
result: 27
66
![Page 67: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/67.jpg)
67
Debugging with pdb
Debugging the simple way:
x = my_function()
print(x) # use print to see variable contents
Debugging the interactive way:
$ python3 -m pdb my_function.py
or...
import pdb
pdb.set_trace() # use “breakpoints” to stop execution
![Page 68: Lecture 07 A First Look at Recursion](https://reader031.fdocuments.in/reader031/viewer/2022020623/61ef70cdfb33125e85691be4/html5/thumbnails/68.jpg)
Debugging with pdb
pdb provides an interactive debugging session.
pdb commands:● c: continue execution
● w: shows the context of the current line it is executing.
● a: print the argument list of the current function
● s: Execute the current line and stop at the first possible
occasion.
● n: Continue execution until the next line in the current
function is reached or it returns.
68https://docs.python.org/3.2/library/pdb.html