"""
Method 1: iterative:
"""
def fib1(self, N):
    if N <= 1: return N
    a, b = 0, 1
    for _ in range(2, N + 1):
        a, b = b, a + b
    return b
    
"""
Method 2: recursive without memorization:
"""
def fib2(self, N):
    if N <= 1: return N
    return self.fib(N - 1) + self.fib(N - 2)
"""
Method 3: recursive with memorization
"""
def fib3(self, N):
    memo = {0:0, 1:1}
    def helper(n):
        if n not in memo:
            memo[n] = helper(n - 1) + helper(n - 2)
        return memo[n]
    return helper(N)