/**
 * <p>Titre : somrecur.java - Estimation de la taille de la pile d'exec.</p>
 * <p>Copyright : (c) ~/2a env. ESSTIN </p>
 * @author   H. Nguyen-Phu
 * @version 1.1  2004.03.04
 * @since   1.0  2003.01.16
 */
import java.io.*;
import javax.swing.JOptionPane;

      /**
       * <p>Titre : Classe 'somrecur'  </p>
       */

public class somrecur  {

        public static PrintWriter jo = new PrintWriter(System.out, true);
        public static PrintWriter jer = new PrintWriter(System.err, true);
	private static short count = 0;

//	public static int Max_v =  Integer.MAX_VALUE;
// 5187: Limite du compteur sur plate-forme "Lintel" avec JDK 1.4.0_02 (salle A111)

	public static short Max_v = Short.MAX_VALUE;

//32396: Limite du compteur sur une plate-forme "Wintel" avec JDK 1.2 (salle A105 - 31.07.2003)
// 4546: Limite du compteur sur une plate-forme "Wintel" avec JDK 1.4.2 (XP computer/ RAM= 256K)
// 5003: Limite de compteur sur une plate-forme "Wintel" avec JBuilder9 & JDK 1.4.1 (XP computer/ RAM= 256K)
 
       /**
         * Méthode d'instance 's_rec' pour calculer la somme récursive
         * @param n  Nombre total d'entiers à sommer
         * @return   un entier long
         */
/*
	public static long s_rec(short n) throws IOException { 		// occup = 8 + 2 ('long' & 'short')
	 long tmp = 0;							// occup = 8 (tmp)
         try {
	    if (n!=0) 	
		tmp = n+s_rec((short)(n-1));				// occup = 4 (@adr. retour)
	 } catch (StackOverflowError soe) {				// occup = 4 (soe)
		jer.println("Dépassement de capacité: "+ soe);  	// occup = 8 (jer + lien sur @Max_v) 
		jer.println("!! compteur = "+ (Max_v-n+1)+ " => Taille_Pile (Ko) # "+ (Max_v-n+1)*34/1024);
	    }
	  return tmp;
	}
*/

       /**
         * Méthode d'instance 's_rec' pour calculer la somme récursive
         * @param n  Nombre total d'entiers à sommer
         * @return   un entier 'int'
         */

	public static int s_rec(short n) throws IOException {  	// occup = 4 + 2 ('int' & 'short')
	 int tmp = 0;						// occup = 4 (tmp)
	 count ++;						// occup = 4 (lien sur @count)
	 try {
	    if (n!=0) 	
		tmp = n+s_rec((short)(n-1));  			// occup = 4 (@adr. retour)
	 } catch (StackOverflowError soe) {			// occup = 4 (@soe)
		jer.println("Dépassement de capacité: "+ soe);	// occup = 4 (@jer)
		jer.println("!! count = "+ count + " => Taille_Pile (Ko) # "+ count*26/1024);
	    }
	  return tmp;
	}

	
	public static void main(String [] arg) throws IOException {

	  String res;
          if (arg.length == 1)
              Max_v = Short.parseShort(arg[0]);

          jo.println("\nSOMRECUR: D\u00e9marrage du calcul de 's_rec' (somme r\u00e9cursive)");
          res= "\nSOMRECUR: Somme re'cursive des "+Max_v+" ers entiers\n";
          res += "Usage:   java  somrecur  [un_entier_'assez_grand'] \n";
          res += "\nA FAIRE LA RETRO-ANALYSE ! (c)~/2a env. MAJ: 2006.08.27  18h20\n";
    	  res += "EXERCICE:  Analyser la complexité spatiale  et déduire \n";
  	  res += "========   l'occupation maximale de la pile système...\n\n";

          res +="Somme de 1 à "+Max_v;
	  res += " =   "+ s_rec(Max_v) + " / 'long' !?\n";

// VERIF. QUANT AU CHOIX DE l'ORDRE DES OPERATEURS :
          res +="\nVerif. / int  (I)   = "+(Max_v)/2*(Max_v+1);
          res +="\nVerif. / int  (II)  = "+(Max_v)*(Max_v+1)/2;
  	  res +="\nVerif. / long (I)   = "+((long)Max_v)/2L*((long)Max_v+1L);
          res +="\nVerif. / long (II)  = "+((long)Max_v)*((long)Max_v+1L)/2L;
  	  res +="\nVerif. / float     = "+((float)Max_v)/2f*((float)Max_v+1f);
  	  res +="\nVerif. / double    = "+((double)Max_v)*((double)Max_v+1d)/2d;

	  jo.println(res);
// PAUSE pour lire le résultat final dans la boîte de dialogue ...
          JOptionPane.showMessageDialog(null,res);
	  es.attente();
	  System.exit(0);
	}
}
