http://www.cs.cornell.edu/courses/cs1110/2019sp Lecture 16: More Recursion! CS 1110 Introduction to Computing Using Python [E. Andersen, A. Bracy, D. Gries, L. Lee, S. Marschner, C. Van Loan, W. White]
Recursion Recursive Function : A function that calls itself (directly or indirectly) Recursive Definition : A definition that is defined in terms of itself 2
A Mathematical Example: Factorial Non-recursive definition: n! = n � n-1 � … � 2 � 1 = n (n-1 � … � 2 � 1) Recursive definition: n! = n (n-1)! for n > 0 Recursive case 0! = 1 Base case What happens if there is no base case? 3
Recursive Call Frames factorial def factorial(n): 1 """Returns: factorial of n. n 3 Precondition: n ≥ 0 an int""" if n == 0: 1 return 1 2 return n*factorial(n-1) 3 factorial(3) 4
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Precondition: n ≥ 0 an int""" if n == 0: 1 return 1 2 return n*factorial(n-1) 3 Call: factorial(3) 5
Recursion factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Precondition: n ≥ 0 an int""" if n == 0: 1 return 1 2 Now what? return n*factorial(n-1) 3 Each call is a new frame. factorial(3) 6
What happens next? (Q) A: B: factorial factorial 1, 3 1, 3, 1 û n n 3 3 2 factorial 1 D: n 2 factorial 1, 3, 1 û n 3 2 C: ERASE FRAME factorial 1, 3 factorial factorial 1 1 n 3 n n 3 2 7
What happens next? (A) A: B: CORRECT factorial factorial 1, 3 1, 3, 1 û n n 3 3 2 factorial 1 D: n 2 factorial 1, 3, 1 û n 3 2 C: ERASE FRAME factorial 1, 3 factorial factorial 1 1 n 3 n n 3 2 8
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1 if n == 0: 1 n 2 return 1 2 return n*factorial(n-1) 3 Call: factorial(3) 9
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 return n*factorial(n-1) 3 Call: factorial(3) 10
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1 return n*factorial(n-1) n 1 3 Call: factorial(3) 11
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 3 Call: factorial(3) 12
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 3 factorial 1 Call: factorial(3) n 0 13
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 3 factorial 1, 2 Call: factorial(3) n 0 14
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 15
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 16
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 RETURN 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 17
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 RETURN 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 18
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 2 RETURN return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 RETURN 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 19
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 2 RETURN return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 RETURN 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 20
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 6 RETURN Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 2 RETURN return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 RETURN 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 21
Recursive Call Frames factorial def factorial(n): 1, 3 """Returns: factorial of n. n 3 6 RETURN Pre: n ≥ 0 an int""" factorial 1, 3 if n == 0: 1 n 2 2 RETURN return 1 2 factorial 1, 3 return n*factorial(n-1) n 1 RETURN 1 3 factorial 1, 2 Call: factorial(3) n 0 RETURN 1 22
Divide and Conquer Goal : Solve problem P on a piece of data data Idea : Split data into two parts and solve problem data 1 data 2 Solve Problem P Solve Problem P Combine Answer! 23
Example: Reversing a String def reverse(s): H e l l o ! """Returns: reverse of s Precondition: s a string""" # 1. Handle base case ! o l l e H # 2. Break into two parts # 3. Combine the result 24
Example: Reversing a String def reverse(s): H e l l o ! """Returns: reverse of s Precondition: s a string""" # 1. Handle base case left H e l l o ! # 2. Break into two parts right ! o l l e left = reverse(s[0]) right = reverse(s[1:]) If this is how we break it up…. # 3. Combine the result How do we combine it? 25
How to Combine? (Q) def reverse(s): H e l l o ! """Returns: reverse of s Precondition: s a string""" # 1. Handle base case left H e l l o ! # 2. Break into two parts right ! o l l e left = reverse(s[0]) right = reverse(s[1:]) # 3. Combine the result return A: left + right B: right + left C: left D: right 26
How to Combine? (A) def reverse(s): H e l l o ! """Returns: reverse of s Precondition: s a string""" # 1. Handle base case left H e l l o ! # 2. Break into two parts right ! o l l e left = reverse(s[0]) right = reverse(s[1:]) CORRECT # 3. Combine the result return A: left + right B: right + left C: left D: right 27
Example: Reversing a String def reverse(s): H e l l o ! """Returns: reverse of s Precondition: s a string""" # 1. Handle base case left H e l l o ! # 2. Break into two parts right ! o l l e left = reverse(s[0]) right = reverse(s[1:]) # 3. Combine the result return right+left 28
What is the Base Case? (Q) def reverse(s): H e l l o ! """Returns: reverse of s Precondition: s a string""" # 1. Handle base case A: if s == "": B: if len(s) <= 2: C: if len(s) <= 1: return s return s return s # 2. Break into two parts D: Either A or C left = reverse(s[0]) would work right = reverse(s[1:]) # 3. Combine the result E: A, B, and C return right+left would all work 29
What is the Base Case? (A) def reverse(s): H e l l o ! """Returns: reverse of s Precondition: s a string""" # 1. Handle base case CORRECT A: if s == "": B: if len(s) <= 2: C: if len(s) <= 1: return s return s return s # 2. Break into two parts D: Either A or C left = reverse(s[0]) would work right = reverse(s[1:]) # 3. Combine the result E: A, B, and C return right+left would all work 30
Example: Reversing a String def reverse(s): """Returns: reverse of s Precondition: s a string""" # 1. Handle base case if len(s) <= 1: Base Case return s # 2. Break into two parts left = reverse(s[0]) s[0] right = reverse(s[1:]) Recursive Case # 3. Combine the result return right+left 31
Alternate Implementation (Q) def reverse(s): """Returns: reverse of s Does this work? Precondition: s a string""" # 1. Handle base case A: YES if len(s) <= 1: return s B: NO # 2. Break into two parts half = len(s)//2 left = reverse(s[:half]) right = reverse(s[half:]) # 3. Combine the result return right+left 32
Recommend
More recommend