#include <iostream>
#include <cmath>

double factorial( int );
double factorial_r( int );
double fibonacci( int );
double fibonacci_r( int );

int main() {
	std::cout.precision( 17 );

	for ( int i = 0; i <= 100; i += 1 ) {
		std::cout << "Explicit:  " << i << "! = " << factorial( i ) << std::endl;
		std::cout << "Recursive: " << i << "! = " << factorial_r( i ) << std::endl;
		std::cout << "Explicit:  F(" << i << ") = " << fibonacci( i ) << std::endl;
		std::cout << "Recursive: F(" << i << ") = " << fibonacci_r( i ) << std::endl;
	}

	return 0;
}

double factorial( int n ) {
	double result = 1;

	for ( double i = 2; i <= n; ++i ) {
		result *= i;
	}

	return result;
}

double factorial_r( int n ) {
	if ( n <= 1 ) {
		return 1;
	} else {
		return n*factorial_r( n - 1 );
	}
}

double fibonacci( int n ) {
	double phi = (std::sqrt(5.0) + 1.0)/2.0;

	double result = (
		std::pow( phi, n ) - std::pow( 1.0 - phi, n )
	)/std::sqrt( 5.0 );

	std::floor( result + 0.5 );
}

double fibonacci_r( int n ) {
	if ( n <= 2 ) {
		return 1;
	} else {
		return fibonacci_r( n - 1 ) + fibonacci_r( n - 2 );
	}
}