WEEK10: 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??

circles pic

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??