#include "factorial.h" 

unsigned long long factorial_iterative ( const unsigned long long n ) {
  unsigned long long total = 1 ;
  unsigned int i ;
  for ( i = 2 ; i <= n ; ++i ) { total *= i ; }
  return total ;
}

unsigned long long factorial_recursive ( const unsigned long long n ) {
  return ( n < 2 ) ? 1 : n * factorial_recursive ( n - 1 ) ;
}

static unsigned long long factorial_tailRecursive_iterate ( const unsigned long long n , const unsigned long long result ) {
  return ( n < 2 ) ? result : factorial_tailRecursive_iterate ( n - 1 , result * n ) ;
}

unsigned long long factorial_tailRecursive ( const unsigned long long n ) {
  return ( n < 2 ) ? 1 : factorial_tailRecursive_iterate ( n , 1 ) ;
}

