#! /usr/bin/python2

def factorial(acc, n):
    if n == 0:
        return acc
    else:
        return lambda : factorial(n*acc, n-1)


def trampoline(f, *args):
    result = f(*args)
    while callable(result):
        result = result()
    return result

print trampoline(factorial, 1, 1001)