#include "factorial.hpp" 

namespace Factorial {

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

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

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

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

} // namespace Factorial
