# L-17 MCS 275 Fri 17 Feb 2017 : fibstack.py
"""
We construct the stack of function calls
of a recursion for Fibonacci numbers.
"""

def fib(nbr):
    """
    Returns the n-th Fibonacci number, n = nbr.
    """
    if nbr == 0:
        return 0
    elif nbr == 1:
        return 1
    else:
        return fib(nbr-1) + fib(nbr-2)

def fibstack(nbr):
    """
    Builds the stack of function calls in
    a recursion for n-th Fibonacci number.
    """
    from ast import literal_eval
    stk = ['F(%d)' % nbr]
    result = 0
    while stk != []:
        print('S =', stk)
        exp = stk.pop(0)
        nbr = literal_eval(exp[2:len(exp)-1])
        if nbr <= 1:
            result = result + nbr
        else:
            stk.insert(0, 'F(%d)' % (nbr-2))
            stk.insert(0, 'F(%d)' % (nbr-1))
    return result

def main():
    """
    Prompts the user for a number and a
    stack to evaluate the Fibonacci number.
    """
    nbr = int(input('give n : '))
    fbs = fibstack(nbr)
    print('F(%d) = %d' % (nbr, fbs), fbs == fib(nbr))

if __name__ == "__main__":
    main()
