public class Fact { public static int fact(int n) { int res = 1; for (int i=1; i<=n; i++) { res = res*i; } return res; } public static int factRec(int n) { if (n==0) return 1; return n*factRec(n-1); // pas une récursive terminal } public static int factRecDepliee(int n) { System.out.println("appel à depliee("+n+")"); if (n==0) return 1; int v = factRecDepliee(n-1); v = v*n; System.out.println("calcul de v="+v); return v; // la dernière instruction c'est une multiplication } public static int factRecTerminaleNormalisee(int n) { return factRecTerminale(n,1); } public static int factRecTerminale(int n,int f) { System.out.println("terminale("+n+","+f+")"); if (n==0) return f; return factRecTerminale(n-1,n*f); } public static int factRecTerminaleDeRec(int n,int f) { while (n!=0) { f = f*n; n = n-1; } return f; } public static void main(String []args) { /* System.out.println(fact(10)); System.out.println(factRec(10)); f(10); // fRec(0,10); fRecNormalisee(10); */ System.out.println(factRecDepliee(10)); System.out.println(factRecTerminaleNormalisee(10)); } public static void f(int n) { for (int i=0; i<n; i++) { System.out.println("valeur de i="+i); // corps de la boucle } } public static void fRecNormalisee(int n) { fRec(0,n); // initialisation de i à 0 } public static void fRec(int i,int n) { if (i==n) return; // fin de la "boucle" System.out.println("valeur de i="+i); // corps de la boucle // appel récursif terminal (il n'y a rien d'autre qui suit) fRec(i+1,n); // pas suivant de la boucle } public static void fRecDerec(int i,int n) { while (i!=n) { System.out.println("valeur de i="+i); i = i+1; } } }