""" Fibonacci numbers """


def fib(n):
    """ Return the nth Fibonacci number

    F(k) = F(k-1) + F(k-2)

    @param int n:
    @rtype: int

    >>> fib(1)
    1
    >>> fib(2)
    2
    >>> fib(4)
    8
    """
    if n <= 1:
        return 1
    return fib(n-1) + fib(n-2)

#print(fib(4))
#print(fib(10))
#print(fib(20))
#print(fib(25))
#print(fib(30))
#print(fib(40))


def faster_fib(n, seen):
    if n not in seen:
        if n <= 1:
            seen[n] = 1
        else:
            seen[n] = faster_fib(n-1, seen) + faster_fib(n-2, seen)
    return seen[n]

print(faster_fib(990, {}))
#print(fib(1000))
