def iterative ( x ) :
    if int ( x ) != x : raise ValueError , 'Parameter must be an integer.'
    if x < 0 : raise ValueError , 'Parameter must be a non-negative integer.'
    total = 1
    for i in range ( 2 , x + 1 ) :
        total *= i
    return total
    
def recursive ( x ) :
    if int ( x ) != x : raise ValueError , 'Parameter must be an integer.'
    if x < 0 : raise ValueError , 'Parameter must be a non-negative integer.'
    elif x < 2 : return 1
    else : return x * recursive ( x - 1 )

def tailRecursive ( x ) :
    if int ( x ) != x : raise ValueError , 'Parameter must be an integer.'
    if x < 0 : raise ValueError , 'Parameter must be a non-negative integer.'
    elif x < 2 : return 1
    else :
        def iterate ( i , result ) : return result if i < 2 else iterate ( i - 1 , result * i )
        return iterate ( x , 1 )
