/* quick demo of recursive factorial and non-recursive factorial */
/* P. Conrad   CISC105  Fall 2004  */


#include <stdio.h>

int iterativeFactorial(int n);
int recursiveFactorial(int n);
int recursiveFactorialA(int n);
int recursiveFactorialC(int n);


int main(int argc, char *argv[])
{
  

  int n;

  int result;

  if (argc!=3)
    {
      printf("Usage: %s number method\n");
      printf("  number should be an integer >= 0\n");
      printf("  method should be r or i\n");
      exit(-1);
    }

  n = atoi(argv[1]);

  if (n<0)
    {
      printf("Sorry, number should be >=0 \n");
      printf("You entered %d\n");
      printf("Please run the program again.\n");
      exit(-1);
    }
  
  switch(argv[2][0])
    {
    case 'a':
      result = recursiveFactorialA(n);
      break;

    case 'c':
      result = recursiveFactorialC(n);
      break;

    case 'r':
      result = recursiveFactorial(n);
      break;
    case 'i':
      result = iterativeFactorial(n);
      break;
    default:
      printf("Sorry, method should be r or i\n");
      exit(-1);    
    }

  printf("result=%d\n",result);

  return 0;
}

int iterativeFactorial(int n)
{

  int total = 1;
  int i;

  for (i=2; i<=n; i++)
    total *= i;

  return total;


}

int recursiveFactorial(int n)
{
  printf("In recursiveFactorial n=%d\n", n);
  if (n<2)
    return 1;
  else 

    return n * recursiveFactorial(n-1);

}

int recursiveFactorialC(int n)
{
  printf("In recursiveFactorialC n=%d\n", n);
  return n * recursiveFactorialC(n-1);
}


int recursiveFactorialA(int n)
{
  return ( (n<2)? 1 : n * recursiveFactorial(n-1));
}


