fruitful and graphical recursion - github pages
TRANSCRIPT
Fruitful and Graphical Recursion
• Base case: Solving problem directly. • Recursive case:
• REDUCE the problem to smaller subproblem(s) (smaller version(s) of itself)
• DELEGATE the smaller problems to the recursion fairy (formally known as induction hypothesis) and assume they're solved correctly
• COMBINE the solution(s) of the smaller subproblems to reach/return the solution
Recursive Algorithm
• We say a recursion is fruitful if the recursive function returns a value (other than None)
Fruitful Recursion
• Let’s write a fruitful recursive function that sums up integers from 1 down to n (without loops)
• Recursive case. (REDUCE/ DELEGATE/ COMBINE): Can think of sum(5) as 5 + sumUp(4)
sumUp(n)
In[1] sumUp(5)
Out[1] 15
In[2] sumUP(10)
Out[2] 55
Unfolding the Recursion
Fruitful Recursion: Base Case(s) Required!
What happens if we eliminate the base case
for sumUp?
PalindromesEVE
CIVICMADAM
AVID DIVASTEP ON NO PETS
STRESSED DESSERTSABLE WAS I ERE I SAW ELBA
LIVED ON DECAF FACED NO DEVIL
• REDUCE it smaller version of the same problem
• Check if s' = s[1:-1] is a palindrome
Recursive Approach
0
s
palindrome(s')-1
palindrome(s)
• DELEGATE the smaller problems to the recursion fairy (formally known as induction hypothesis) and assume they're solved correctly
Recursive Approach
s
palindrome(s')0 -1
palindrome(s)
• COMBINE the solution(s) of the smaller subproblems to reach/return the solution
• return True if palindrome(s') is True and s[0] is same as s[-1]
Recursive Approach
s
palindrome(s')0 -1
palindrome(s)
Factorial
Factorial. Denoted n!
number of different the arrangements of n items.n! = n * (n − 1) * (n − 2) * . . . . * 2 * 1
3 items were arranged in 6 different ways. Or 3x2x1.
•
•
• Recursive case. factorial(n) is n * factorial(n-1)
• Base case.factorial(0) = 1
n! = n * (n − 1) * (n − 2) * … * 2 * 1
n! = n * (n − 1)!
factorial(n)
• Fruitful recursion: recursion that "computes and returns" values
• Remember to implement the base case!
• Remember to store the value returned by recursive calls!
• Debug using print statements
Summary
Recursion with Turtle Graphics
• Python has a built-in module named turtle. See the Python turtle module API for details.
Turtle
Playing with Turtle:polyFlow
The Sun totally ruined by plans! You can't see anything....
This is what I am drawing
120 degrees
Graphical Recursion
• Graphical recursion with a single recursive call
• Fruitful recursion with turtles
• Learn about function invariance in anticipation of multiple recursive calls
Overview
Sierpinski's Triangle
Single Recursive Call: Recursive Spirals
Recursive Spirals
sideLen
sideLen * shrinkFactor
sideLen * shrinkFactor * shrinkFactor
Function Frame Model to
Understand spiral
spiral(625, 90, 0.8, 250)
625sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(500, ...)
625
spiral(625, 90, 0.8, 250)
625sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(500, ...)
625
spiral(625, 90, 0.8, 250)
625sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(500, ...)
625
spiral(500, 90, 0.8, 250)
500sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(400, ...)
spiral(625, 90, 0.8, 250)
625sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(500, ...)
625
spiral(500, 90, 0.8, 250)
500sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(400, ...)
500
spiral(625, 90, 0.8, 250)
625sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(500, ...)
625
spiral(500, 90, 0.8, 250)
500sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(400, ...)
500
spiral(625, 90, 0.8, 250)
625sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(500, ...)
625
spiral(500, 90, 0.8, 250)
500sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(400, ...)
500
spiral(400, 90, 0.8, 250)
400sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(320, ...)
spiral(625, 90, 0.8, 250)
625sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(500, ...)
625
spiral(500, 90, 0.8, 250)
500sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(400, ...)
500
spiral(400, 90, 0.8, 250)
400sideLen
if sideLen > 250: fd(sideLen) lt(90) spiral(320, ...)
Invariant Spiralling
• A function is invariant relative to an objects state if the state of the object is the same before and after a function is invoked
Invariance
Fruitful Recursion with Turtles
See Lecture Jupyter Notebook
These slides have been adapted from: • http://cs111.wellesley.edu/spring19 and
• https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/
Acknowledgments