class Factorial {

  public static void main(String args[]) {
    System.out.println("Iterative = " + factorialIterative(7));
    System.out.println("Recursive = " + factorialRecursive(7));

    System.out.println("\nFactorial(7)");

    System.out.println("\nPrinting  = " + factorialRecursiveWPrinting(7, 1));
  }
  public static int factorialIterative(int n) {
    int fact = 1, i;

    if (n > 1) {
      for (; n > 1; n--) {
        fact = fact * n;
      }
    }
    return fact;
  }
  public static int factorialRecursive(int n) {
     int fact = 1;

     if (n > 1) {
     	fact = n * factorialRecursive(n - 1);
     }
     return fact;
  }
  public static int factorialRecursiveWPrinting(int n, int indent) {
     // Exercise:  remove loop(s) and create recursive method(s)
     //            that will perform the same operations
     int i, fact = 0, result = 1;


     for (i = 0; i < indent; i++) {
       System.out.print("  ");
     }
     System.out.println("n = " + n);

     if (n == 0 || n == 1) {
       fact = 1;

       for (i = 0; i < indent; i++) {
         System.out.print("  ");
       }
       System.out.println("return 1");
     }
     else if (n > 1) {
       for (i = 0; i < indent; i++) {
         System.out.print("  ");
       }
       System.out.println("factorial(" + (n - 1) + ")");

       result = factorialRecursiveWPrinting(n - 1, indent + 1);
       fact = n * result;

       for (i = 0; i < indent; i++) {
         System.out.print("  ");
       }
       System.out.println("return n * factorial(" + (n - 1) + ") = " +
                          n + " * " + result + " = " +
                          fact);
     }

     return fact;
  }
}
