http://en.wikipedia.org/wiki/Fibonacci_number
def fib(n):
S=[]
F={}
S.append(n)
while S!=[]:
m = S[-1]
if m in (0,1):
F[m] = m
S.pop(-1)
continue
if not (m-1 in F):
S.append(m-1)
continue
if not (m-2 in F):
S.append(m-2)
continue
F[m]= F[m-1]+F[m-2]
S.pop(-1)
return F[n]