// for
    public static int factorial(int n) {
        int total = 1;
        for (int i = 1; i <= n; ++i) {
            total *= i;
        }
        return total;
    }
    // recursive
    public static int factorialRecursive(int n) {
        if (n <= 1) {
            return n;
        }
        return n * factorialRecursive(n - 1);
    }
    // tail recursive
    public static int factorialTailRecursive(int n, int total) {
        if (n <= 1) {
            return total;
        }
        return factorialTailRecursive(n - 1, n * total);
    }