import java.awt.*;  
import
java.awt.event.*; 
public
class RecursionVsIteration extends Frame
 {
public RecursionVsIteration()
{
   this.addWindowListener (new WindowAdapter(){
     public void windowClosing(WindowEvent e){
     dispose();
     System.exit(0);}  
      });
}
public static void main(String args[])
{
   System.out.println("Starting App: Four examples of recursion, iteration, and explicit formulae. N = 100 for examples 1-3, N = 12 for Fibonacci.");
   RecursionVsIteration f = new RecursionVsIteration();
   f.setSize(100,100);
   f.show();
      //Recursive solution to 1)
   System.out.println("Recursively: 1+2+3+...+100 = "+sumN(100));
      //Iterative solution to 1)
   int n = 0, N = 100;
   for(int i = 1; i <= N; i++)
	n += i;
   System.out.print("Iteratively: 1+2+3+...+100 = "+n);
      //Explicit solution to 1)
   System.out.println("\nExplicit formula, N*(N+1)/2: 1+2+3+...+100 = "+N*(N+1)/2);

      //Recursive solution to 2)
   System.out.println("\n\nRecursively: 1+3+...+(2*100-1) = "+sumOddN(2*100-1));
      //Iterative solution to 2)
   n = 0;
   int oddN = 2*N-1;
   for(int i = 1; i <= N; i++)
	n += 2*i-1;
   System.out.print("Iteratively: 1+3+...+199 = "+n);
      //Explicit solution to 2)
   System.out.println("\nExplicit formula, N*N: 1+3+...+(2*100-1) = "+N*N);

      //Recursive solution to 3)
      //The 20! is near the limit of a long, 100! is outside the limit of a float, ~2E128.
      //The exponent on a double is 11-bits excess 1023, so we use the double data type.
   System.out.println("\n\nRecursively, n! = n*(n-1)!: 1*2*3*...*100 = "+factorial(N));
      //Iterative solution to 3)
   double nD = 1;
   for(int i = 1; i <= N; i++)
  	nD *= i;
   System.out.print("Iteratively: 1*2*3*...*100 = "+nD);
      //Explicit solution to 3)
   System.out.println("\nExplicit formula, N! = None");

      //Recursive solution to 4)
   System.out.println("\n\nRecursively, fibo(n) = fibo(n-1) + fibo(n-2): 1,1,2,3,5,8,...,(a(n-1)+a(n-2)). fibo(12) = "+fibo(12));
      //Iterative solution to 4)
   double fibo3 = 0, fibo2 = 1, fibo1 = 1;
   for(int j = 3; j <= 12; j++)
   {
	fibo3 = fibo2 + fibo1;
	fibo1 = fibo2;
	fibo2 = fibo3;
   }
   System.out.print("Iteratively, fibo(n): 1,1,2,3,5,8,...,(a(n-1)+a(n-2)). fibo(12) = "+fibo3);
      //Explicit solution to 4)
   System.out.println("\nExplicit formula, fibo(n) = ...to be determined");

      //Recursive solution to the sum of the first N fibonacci terms)
   System.out.println("\n\nRecursively, sum(fibo(n)) = sum(fibo(n-1) + fibo(n-2)): 1+1+2+3+5+8+...+(a(n-1)+a(n-2)). sum(fibo(12)) = "+fiboSum(12));
}//main()

public static int sumN(int n)
{
   if(n==1)
   	return 1;
   else
	return n + sumN(n-1);
}//sumN()

public static int sumOddN(int n)
{
   if(n<=0)//error trap for the inadvertant even argument
	return -1;
   if(n==1)
	return 1;
   else
	return n + sumOddN(n-2);
}//sumOddN()

public static double factorial(double n)
{
   if(n==1)
	return 1;
   else
	return n * factorial(n-1);
}//factorial()
public static double fibo(double n)
{
   if(n==2 || n==1)
	return 1;
   else
	return fibo(n-1) + fibo(n-2);
}//fibo()
public static double fiboSum(int n)
{
   double fiboSumN = 0;
   for(int i = 1; i <= n; i++)
	fiboSumN += fibo(i);
   return fiboSumN;
}//fiboSum()
}//RecursionVsIteration

/*

Starting App: Four examples of recursion, iteration, and explicit formulae. N = 100 for examples 1-3, N = 12 for Fibonacci.
Recursively: 1+2+3+...+100 = 5050
Iteratively: 1+2+3+...+100 = 5050
Explicit formula, N*(N+1)/2: 1+2+3+...+100 = 5050


Recursively: 1+3+...+(2*100-1) = 10000
Iteratively: 1+3+...+199 = 10000
Explicit formula, N*N: 1+3+...+(2*100-1) = 10000


Recursively, n! = n*(n-1)!: 1*2*3*...*100 = 9.33262154439441E157
Iteratively: 1*2*3*...*100 = 9.33262154439441E157
Explicit formula, N! = None


Recursively, fibo(n) = fibo(n-1) + fibo(n-2): 1,1,2,3,5,8,...,(a(n-1)+a(n-2)). fibo(12) = 144.0
Iteratively, fibo(n): 1,1,2,3,5,8,...,(a(n-1)+a(n-2)). fibo(12) = 144.0
Explicit formula, fibo(n) = ...to be determined


Recursively, sum(fibo(n)) = sum(fibo(n-1) + fibo(n-2)): 1+1+2+3+5+8+...+(a(n-1)+a(n-2)). sum(fibo(12)) = 376.0
Exit code: 0
No Errors

*/