CS 1110: Introdution to Computing Using Python Leture 15 Reursion [Andersen, Gries, Lee, Marshner, Van Loan, White]
Announements: Prelim 1 Graded and released Mean: 81 out of 104 (78%) Can pik up your exam in homework handak room Need Cornell ID Suggest printing your netid on paper Do not disuss exam with people taking makeups. Regrade requests: we will send email to you 10/13/16 Reursion 2
Announements: Assignment 3 Released. Due: Thursday, Marh 30 th, 11:59pm Reommendation: follow milestone deadlines. You MUST aknowledge help from others We run software analyzers to detet similar programs Have had some aademi integrity violations so far Not a reursion assignment! 10/13/16 Reursion 3
Out. Not a reursion la! Announement: La 8 10/13/16 Reursion 4
Reursion Reursive Definition: A definition that is defined in terms of itself 10/13/16 Reursion 5
A Mathematial Example: Fatorial Non-reursive definition: n! = n n-1 2 1 = n (n-1 2 1) Reursive definition: n! = n (n-1)! for n 0 0! = 1 Reursive ase Base ase What happens if there is no ase ase? 10/13/16 Reursion 6
Reursion Reursive Definition: A definition that is defined in terms of itself Reursive Funtion: A funtion that alls itself (diretly or indiretly) 10/13/16 Reursion 7
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1 n 3 3 return n*fatorial(n-1) Call: fatorial(3) 10/13/16 Reursion 8
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 3 return n*fatorial(n-1) Call: fatorial(3) 10/13/16 Reursion 9
Reursion 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 3 return n*fatorial(n-1) Call: fatorial(3) Now what? Eah all is a new frame. 10/13/16 Reursion 10
What happens next? fatorial 1, 3 n 3 A: fatorial 1, 3 n 3 fatorial 1 n 2 C: CORRECT ERASE FRAME fatorial 1 n 3 B: fatorial 1, 3, 1 n 3 2 D: fatorial 1, 3, 1 n 3 2 fatorial 1 n 2 10/13/16 Reursion 11
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1 n 2 3 return n*fatorial(n-1) Call: fatorial(3) 10/13/16 Reursion 12
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 3 return n*fatorial(n-1) Call: fatorial(3) 10/13/16 Reursion 13
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1 3 return n*fatorial(n-1) n 1 Call: fatorial(3) 10/13/16 Reursion 14
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1, 3 3 return n*fatorial(n-1) n 1 Call: fatorial(3) 10/13/16 Reursion 15
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1, 3 3 return n*fatorial(n-1) n 1 Call: fatorial(3) fatorial n 0 1 10/13/16 Reursion 16
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1, 3 3 return n*fatorial(n-1) n 1 Call: fatorial(3) fatorial n 0 1, 2 10/13/16 Reursion 17
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 18
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 19
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 RETURN 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 20
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 RETURN 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 21
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 RETURN 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 RETURN 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 22
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 fatorial 1, 3 n 2 RETURN 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 RETURN 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 23
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 RETURN 6 fatorial 1, 3 n 2 RETURN 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 RETURN 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 24
Reursive Call Frames 1 2 def fatorial(n): """Returns: fatorial of n. Pre: n 0 an int""" if n == 0: return 1 fatorial 1, 3 n 3 RETURN 6 fatorial 1, 3 n 2 RETURN 2 fatorial 1, 3 3 return n*fatorial(n-1) Call: fatorial(3) n 1 RETURN 1 fatorial 1, 2 n 0 RETURN 1 10/13/16 Reursion 25
Example: Fionnai Sequene Sequene of numers: 1, 1, 2, 3, 5, 8, 13,... a 0 a 1 a 2 a 3 a 4 a 5 a 6 Get the next numer y adding previous two What is a 8? A: a 8 = 21 B: a 8 = 29 C: a 8 = 34 D: None of these. 10/13/16 Reursion 26
Example: Fionnai Sequene Sequene of numers: 1, 1, 2, 3, 5, 8, 13,... a 0 a 1 a 2 a 3 a 4 a 5 a 6 Get the next numer y adding previous two What is a 8? A: a 8 = 21 B: a 8 = 29 C: a 8 = 34 orret D: None of these. 10/13/16 Reursion 27
Example: Fionnai Sequene Sequene of numers: 1, 1, 2, 3, 5, 8, 13,... a 0 a 1 a 2 a 3 a 4 a 5 a 6 Get the next numer y adding previous two What is a 8? Reursive definition: a n = a n-1 + a n-2 a 0 = 1 a 1 = 1 Reursive Case Base Case (another) Base Case Why did we need two ase ases this time? 10/13/16 Reursion 28
Fionai as a Reursive Funtion def fionai(n): """Returns: Fionai no. a n Preondition: n 0 an int""" if n <= 1: return 1 Base ase(s) return (fionai(n-1)+ fionai(n-2)) Reursive ase Handles oth ase ases in one onditional. 10/13/16 Reursion 29
Fionai as a Reursive Funtion def fionai(n): """Returns: Fionai no. a n Preondition: n 0 an int""" if n <= 1: return 1 return (fionai(n-1)+ fionai(n-2)) fionai 3 n 5 fionai 1 fionai 1 n 4 n 3 10/13/16 Reursion 30
Reursion vs Iteration Reursion is provaly equivalent to iteration Iteration inludes for-loop and while-loop (later) Anything an do in one, an do in the other But some things are easier with reursion And some things are easier with iteration Will not teah you when to hoose reursion We just want you to understand the tehnique 10/13/16 Reursion 31
Reursion is est for Divide and Conquer Goal: Solve prolem P on a piee of data data 10/13/16 Reursion 32
Reursion is est for Divide and Conquer Goal: Solve prolem P on a piee of data data Idea: Split data into two parts and solve prolem data 1 data 2 Solve Prolem P Solve Prolem P 10/13/16 Reursion 33
Reursion is est for Divide and Conquer Goal: Solve prolem P on a piee of data data Idea: Split data into two parts and solve prolem data 1 data 2 Solve Prolem P Solve Prolem P Comine Answer! 10/13/16 Reursion 34
Divide and Conquer Example Count the numer of 'e's in a string: p e n n e Two 'e's p e n n e One 'e' One 'e' 10/13/16 Reursion 35
Divide and Conquer Example Count the numer of 'e's in a string: p e n n e Two 'e's p e n n e Zero 'e's Two 'e's 10/13/16 Reursion 36
Three Steps for Divide and Conquer 1. Deide what to do on small data Some data annot e roken up Have to ompute this answer diretly 2. Deide how to reak up your data Both halves should e smaller than whole Often no wrong way to do this (next leture) 3. Deide how to omine your answers Assume the smaller answers are orret Comining them should give igger answer 10/13/16 Reursion 37
Divide and Conquer Example def num_es(s): """Returns: # of 'e's in s""" # 1. Handle small data if s == '': return 0 elif len(s) == 1: return 1 if s[0] == 'e' else 0 # 2. Break into two parts left = num_es(s[0]) right = num_es(s[1:]) # 3. Comine the result return left+right Short-ut for s[0] if s[0] == 'e : return 1 else: return 0 p e n n 0 + 2 s[1:] e 10/13/16 Reursion 38
Divide and Conquer Example def num_es(s): """Returns: # of 'e's in s""" # 1. Handle small data if s == '': return 0 elif len(s) == 1: return 1 if s[0] == 'e' else 0 # 2. Break into two parts left = num_es(s[0]) right = num_es(s[1:]) # 3. Comine the result return left+right Short-ut for s[0] if s[0] == 'e : return 1 else: return 0 p e n n 0 + 2 s[1:] e 10/13/16 Reursion 39
Divide and Conquer Example def num_es(s): """Returns: # of 'e's in s""" # 1. Handle small data if s == '': return 0 elif len(s) == 1: return 1 if s[0] == 'e' else 0 # 2. Break into two parts left = num_es(s[0]) right = num_es(s[1:]) # 3. Comine the result return left+right Short-ut for s[0] if s[0] == 'e : return 1 else: return 0 p e n n 0 + 2 s[1:] e 10/13/16 Reursion 40
Divide and Conquer Example def num_es(s): """Returns: # of 'e's in s""" # 1. Handle small data if s == '': return 0 elif len(s) == 1: return 1 if s[0] == 'e' else 0 # 2. Break into two parts left = num_es(s[0]) right = num_es(s[1:]) # 3. Comine the result return left+right Short-ut for s[0] if s[0] == 'e : return 1 else: return 0 p e n n 0 + 2 s[1:] e 10/13/16 Reursion 41
Divide and Conquer Example def num_es(s): """Returns: # of 'e's in s""" # 1. Handle small data if s == '': return 0 elif len(s) == 1: return 1 if s[0] == 'e' else 0 Base Case # 2. Break into two parts left = num_es(s[0]) right = num_es(s[1:]) # 3. Comine the result return left+right Reursive Case 10/13/16 Reursion 42
Exerise: Remove Blanks from a String def (s): """Returns: s ut with its lanks removed""" 1. Deide what to do on small data If it is the empty string, nothing to do if s == '': return s If it is a single harater, delete it if a lank if s == ' ': # There is a spae here return '' # Empty string else: return s 10/13/16 Reursion 43
Exerise: Remove Blanks from a String def (s): """Returns: s ut with its lanks removed""" 2. Deide how to reak it up left = (s[0]) # A string with no lanks right = (s[1:]) # A string with no lanks 3. Deide how to omine the answer return left+right # String onatenation 10/13/16 Reursion 44
Putting it All Together def (s): """Returns: s w/o lanks""" if s == '': return s elif len(s) == 1: return '' if s[0] == ' ' else s left = (s[0]) right = (s[1:]) return left+right Handle small data Break up the data Comine answers 10/13/16 Reursion 45
Putting it All Together def (s): """Returns: s w/o lanks""" if s == '': return s elif len(s) == 1: return '' if s[0] == ' ' else s left = (s[0]) right = (s[1:]) return left+right Base Case Reursive Case 10/13/16 Reursion 46
Following the Reursion a 10/13/16 Reursion 47
Following the Reursion a a stops (ase ase) a stops (ase ase) 10/13/16 Reursion 48
Following the Reursion a a 10/13/16 Reursion 49
Following the Reursion a a a 10/13/16 Reursion 50
Following the Reursion a a a 10/13/16 Reursion 51
Following the Reursion a a a 10/13/16 Reursion 52
Following the Reursion a a a 10/13/16 Reursion 53
Following the Reursion a a a
Following the Reursion a a a
Following the Reursion a a a
Following the Reursion a a a
Following the Reursion a a a
Following the Reursion a a a a
Following the Reursion a a a a a
Following the Reursion a a a a a a
Tower of Hanoi Three towers: left, middle, and right n disks of unique sizes on left Goal: move all disks from left to right Cannot put a larger disk on top of a smaller disk 1 2 3 4 left middle right 10/13/16 Reursion 62
1 Dis 1. Move from left to right 1 left middle right 10/13/16 Reursion 63
1 Dis 1. Move from left to right left middle right 1 10/13/16 Reursion 64
2 Diss 1. Move from left to middle 1 2 left middle right 10/13/16 Reursion 65
2 Diss 1. Move from left to middle 2. Move from left to right 2 1 left middle right 10/13/16 Reursion 66
2 Diss 1. Move from left to middle 2. Move from left to right 3. Move from middle to right 1 left middle right 2 10/13/16 Reursion 67
2 Diss 1. Move from left to middle 2. Move from left to right 3. Move from middle to right 1 2 left middle right 10/13/16 Reursion 68
3 Diss 1. Move from left to right 1 2 3 left middle right 10/13/16 Reursion 70
3 Diss 1. Move from left to right 2. Move from left to middle 2 3 1 left middle right 10/13/16 Reursion 71
3 Diss 1. Move from left to right 2. Move from left to middle 3. Move from right to middle 3 2 1 left middle right 10/13/16 Reursion 72
1 3 2 left middle right 3 Diss 1. Move from left to right 2. Move from left to middle 3. Move from right to middle 4. Move from left to right 10/13/16 Reursion 73
3 Diss 1 2 left middle right 3 1. Move from left to right 2. Move from left to middle 3. Move from right to middle 4. Move from left to right 5. Move from middle to left 10/13/16 Reursion 74
3 Diss 1 2 3 left middle right 1. Move from left to right 2. Move from left to middle 3. Move from right to middle 4. Move from left to right 5. Move from middle to left 6. Move from middle to right 10/13/16 Reursion 75
3 Diss 2 1 3 left middle right 1. Move from left to right 2. Move from left to middle 3. Move from right to middle 4. Move from left to right 5. Move from middle to left 6. Move from middle to right 7. Move from left to right 10/13/16 Reursion 76
3 Diss 1 2 left middle right 3 1. Move from left to right 2. Move from left to middle 3. Move from right to middle 4. Move from left to right 5. Move from middle to left 6. Move from middle to right 7. Move from left to right 10/13/16 Reursion 77
4 Diss: High-level Idea 1 2 3 4 left middle right 10/13/16 Reursion 78
4 Diss: High-level Idea Plan: move top three disks from left to middle 4 1 2 3 left middle right 10/13/16 Reursion 79
4 Diss: High-level Idea 1 2 3 4 left middle right Plan: move top three disks from left to middle Move: largest disk from left to right 10/13/16 Reursion 80
4 Diss: High-level Idea 1 2 3 4 Plan: move top three disks from left to middle Move: largest disk from left to right Plan: move top three disks from middle to right left middle right 10/13/16 Reursion 81
4 Diss: High-level Idea Plan: move disks 1, 2, and 3 from left to middle 1 2 3 4 left middle right 10/13/16 Reursion 82
4 Diss: High-level Idea Plan: move disks 1, 2, and 3 from left to middle Plan: move disks 1 and 2 from left to right 3 4 1 2 left middle right 10/13/16 Reursion 83
4 4 Diss: High-level Idea 1 3 2 left middle right Plan: move disks 1, 2, and 3 from left to middle Plan: move disks 1 and 2 from left to right Move: disk 3 from left to right 10/13/16 Reursion 84
4 Diss: High-level Idea 4 1 2 3 left middle right Plan: move disks 1, 2, and 3 from left to middle Plan: move disks 1 and 2 from left to right Move: disk 3 from left to right Plan: move disks 1 and 2 from right to middle 10/13/16 Reursion 85
4 Diss: High-level Idea 4 1 2 3 left middle right Plan: move disks 1, 2, and 3 from left to middle Plan: move disks 1 and 2 from left to right Move: disk 3 from left to right Plan: move disks 1 and 2 from right to middle 10/13/16 Reursion 86
4 Diss: High-level Idea 1 2 3 4 left middle right Plan: move disks 1, 2, and 3 from left to middle Plan: move disks 1 and 2 from left to right Move: disk 3 from left to right Plan: move disks 1 and 2 from right to middle Move: disk 4 from left to right 10/13/16 Reursion 87
4 Diss: High-level Idea 1 2 3 4 left middle right Plan: move disks 1, 2, and 3 from left to middle Plan: move disks 1 and 2 from left to right Move: disk 3 from left to right Plan: move disks 1 and 2 from right to middle Move: disk 4 from left to right Plan: move disks 1, 2, and 3 from middle to right 10/13/16 88
4 Diss: High-level Idea Plan: move disks 1, 2, and 3 from left to middle 1 2 3 4 Plan: move disks 1 and 2 from left to right Move: disk 3 from left to right Plan: move disks 1 and 2 from right to middle left middle right Move: disk 4 from left to right Plan: move disks 1, 2, and 3 from middle to right 10/13/16 89
Oservation: Plans within a Plan High-level plan Low-level plan Plan: move disks 1, 2, and 3 from left to middle Plan: move disks 1 and 2 from left to right Move: disk 3 from left to right Plan: move disks 1 and 2 from right to middle Move: disk 4 from left to right Plan: move disks 1, 2, and 3 from middle to right 10/13/16 90
General Pattern To move n disks from soure to target: 1 2 3 disks 1,, n-1 4 disk n soure other disks? other target (soure, other, and target an e any permutation of left, middle and right) 1. Plan: move disks 1,, n-1 from soure to other 2. Move: disk n to from soure to target 3. Plan: move disks 1,, n-1 from other to target 10/13/16 Reursion 91