<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">import java.io.*;
import javax.swing.*;
import static java.lang.Math.*;   // cf. JDK  1.5  et plus ...
/** 'Fact_r' : Calcul récursif de factorielle avec mesure des durées d'exécution via une amplification adéquate avec 'currentTimeMillis()' et avec 'System.nanotime()' à titre comparatif  ...
  *  @author  (c)~/2a env.  H. Nguyen-Phu
  *  @version  1.55  2011.02.05
  *  @since      1.0    2002.11.25
  */
public class Fact_r extends MesureDeDuree1 {

/** n :  champ privé, de classe et de type ENTIER  dans le calcul de factorielle n!  */ 
  private static int n;
/** Déclaration et définition récursive de la méthode de classe 'FACT(N)'
     * @param N  un entier naturel
     * @return   un entier long = N!       */
  public static long FACT(int N)  {
    if (N&lt;= 1) return 1;
    return	N*FACT(N-1);          }
/** Définition de la méthode d'instance  'TraitementAMesurer'
     * Sa déclaration a été donnée dans la super classe 'MesureDeDuree'
     * @return un entier long = n!         */
  long TraitementAMesurer()  {  // Calcul de n!
       return FACT(n);       }
/** Méthode principale publique  de classe 'main(...)'.
  * Elle utilise la classe 'es' pour accéder à la méthode de classe:
  *    attente() - affichage de l'heure de fin d'exécution du 'main()',
  * @param arg   Tableau de chaînes pour ligne de commande ici
  */
  public static void main(String args[])  {
    jo.println("\nFact_r Calcul du factoriel N par récursion (0&lt;= N &lt;=20)");
    jo.println("------ Usage:  java  Fact_r   unEntier_entre_0_et_20");
    jo.println("       Par de'faut   N= 20. (c)~/2A env. 2011.02.05 11:20\n");
    jo.println("EXERCICE: Faire l'analyse du prog. et expliciter le principe algorithmique");
    jo.println("--------  de mesure des dure'es d'exe'cution  &lt;&lt;  a`  50 millisecondes.\n");
    if (args.length == 0)	n = 20;
      else { 	n = Integer.parseInt(args[0]);
		if (n &lt; 0 || n &gt; 20)  n = 20;
    }
    Kmax= 5000000; // facteur d'amplification pq Duree totale &gt;&gt; 50 ms.
//  Kmax: 1er champ protégé dans la super classe: 'MesureDeDuree'
    Fact_r  monTest = new Fact_r();
    String resultat = "Factorielle:  "+ n +"! = "+res+" / 'long'\n";
//  res: 2nd champ protégé dans la super classe: 'MesureDeDuree'
    jo.print(resultat);
    if (n &gt; 0)  {
      double factN = pow(n/E, n)*sqrt(2d*PI*n)*(1d+1.002/12d/n);
      jo.printf("Stirling approx.= %23.16e si n est suffisamment grand...\n\n", factN);  // pour vérification
    }
// Affichage dans la boîte de dialogue du résultat final: n!
    JOptionPane.showMessageDialog(null,resultat);
    es.attente();
    System.exit(0);
  }
}
</pre></body></html>