import time
from memoized import memoized

N, M = 70, 35

def factorial_without_memoization(n):
    if n in (0, 1):
        return n
    else:
        return n * factorial_without_memoization(n-1)

for i in range(N, N+2):
    t_s = time.clock()
    res = factorial_without_memoization(i)
    t_e = time.clock()
    print 'factorial_without_memoization(%d): %f' % (i, t_e - t_s)
    t_s = time.clock()
    res = factorial_without_memoization(i)
    t_e = time.clock()
    print 'factorial_without_memoization(%d): %f' % (i, t_e - t_s)
    
def fibonacci_without_memoization(n):
    if n in (0, 1):
        return n
    else:
        return fibonacci_without_memoization(n-1) + \
            fibonacci_without_memoization(n-2)

for i in range(M, M+2):
    t_s = time.clock()
    res = fibonacci_without_memoization(i)
    t_e = time.clock()
    print 'fibonacci_without_memoization(%d): %f' % (i, t_e - t_s)
    t_s = time.clock()
    res = fibonacci_without_memoization(i)
    t_e = time.clock()
    print 'fibonacci_without_memoization(%d): %f' % (i, t_e - t_s)
    
@memoized
def factorial_with_memoization(n):
    if n in (0, 1):
        return n
    else:
        return n * factorial_with_memoization(n-1)

for i in range(N, N+2):
    t_s = time.clock()
    factorial_with_memoization(i)
    t_e = time.clock()
    print 'factorial_with_memoization(%d): %f' % (i, t_e - t_s)
    t_s = time.clock()
    factorial_with_memoization(i)
    t_e = time.clock()
    print 'factorial_with_memoization(%d): %f' % (i, t_e - t_s)
    
@memoized
def fibonacci_with_memoization(n):
    if n in (0, 1):
        return n
    else:
        return fibonacci_with_memoization(n-1) + \
            fibonacci_with_memoization(n-2)

for i in range(M, M+2):
    t_s = time.clock()
    fibonacci_with_memoization(i)
    t_e = time.clock()
    print 'fibonacci_with_memoization(%d): %f' % (i, t_e - t_s)
    t_s = time.clock()
    fibonacci_with_memoization(i)
    t_e = time.clock()
    print 'fibonacci_with_memoization(%d): %f' % (i, t_e - t_s)    
