
public class TailRecursion {

	public static void main(String[] args){
		System.out.println(pow2(1, 1000000, 1));
	}
	
	public static int tailFactorial(int n){
		return tailFactorialHelper(n, 1);
	}
	
	private static int tailFactorialHelper(int n, int acc){
		if( n <= 1 ){
			return acc;
		}else{
			return tailFactorialHelper(n-1, acc*n);
		}
	}
	
	public static int iterativeFactorial(int n){
		int acc = 1;
		
		while( n > 1 ){
			acc *= n;
			n--;
		}
		
		return acc;
	}
	public static int factorial(int n){
		if( n <= 1 ){
			return 1;
		}else{
			return n * factorial(n-1);
		}}
	public static int mystery1(int num){
		if( num%2 == 0 ){
			return num;
		}else{
			return mystery1(num/2);
		}}
	public static int pow1(int n, int i){
		if (i == 0){
			return 1;
		}else{
			return n * pow1(n, i-1);
		}}
	public static int pow2(int n, int i, int acc){
		if (i == 0){
			return acc;
		}else{
			return pow2(n, i-1, n * acc);
		}
	}
}
