WEEK11: recursion
---------------------------------------------------------------
W: recursion in graphics, binary search
REVIEW: concentric circles solution
def reccircle(p, radius, color, w):
""" draw recursive circles """
if radius > 1:
c = Circle(p, radius)
c.setOutline(color)
c.draw(w)
reccircle(p, radius*0.45, color, w)
RECURSIVE GRAPHICS:
- how can we use recursion to draw something like this??
Here are some other interesting examples of recursion in graphics:
BINARY SEARCH with RECURSION:
- the binary search algorithm is a divide-and-conquer algorithm, and these
are usually easy to express using recursion:
[ 2, 6, 9, 20, 21, 33, 49, 72, 74, 99, 106]
^ ^ ^
low mid high
if what we're looking for is at the mid position, we're done
elif what we're looking for is less than what's at the mid position
do the binary search again with high=mid-1
else (what we're looking for is greater than what's at the mid position)
do the binary search again with low=mid+1
and we keep doing this until either we find what we want or
high ends up being less than low
- here are two ways to express this in python:
def recbinsearch(x, y, low, high):
""" return True if x is in y """
if high < low:
return False
else:
mid = (low + high) / 2
if x == y[mid]:
return True
elif x < y[mid]:
return recbinsearch(x,y,low,mid-1)
else:
return recbinsearch(x,y,mid+1,high)
####################################################
def recbinsearch(x, y):
""" return True if x is in y """
if len(y) <= 0:
return False
else:
low = 0
high = len(y)-1
mid = (low + high) / 2
if x == y[mid]:
return True
elif x < y[mid]:
return recbinsearch(x,y[:mid])
else:
return recbinsearch(x,y[(mid+1):])
- what is the difference between these two functions?
- do they both work?
- why might one be slower than the other??