public class Exp { public static int compteur; public static int exp(int x,int n) { System.out.println("exp("+x+","+n+")"); compteur++; if (n==0) return 1; return x*exp(x,n-1); } public static int compteur2; public static int expRapide(int x,int n) { compteur2++; if (n==0) return 1; if (n%2==0) { int r = expRapide(x,n/2); return r*r; } else { int r = expRapide(x,n/2); return x*r*r; } } public static int expRapideAcc(int x,int n,int r) { System.out.println("expRapideAcc("+x+","+n+","+r+")"); if (n==0) return r; if (n==1) return x*r; if (n%2==0) { return expRapideAcc(x*x,n/2,r); } else { return expRapideAcc(x*x,n/2,x*r); } } public static int expRapideAccIter(int x,int n,int r) { while (true) { if (n==0) return r; if (n==1) return x*r; if (n%2!=0) { r = x*r; } x = x*x; n = n/2; } } public static void main(String []a) { int N=20; int X = 2; // for (int n=10; n<N; n++) { // compteur = 0; // System.out.print(X+"^"+n+"="+exp(X,n)); // System.out.println(" Compteur="+compteur); // } // for (int n=10; n<N; n++) { // compteur2 = 0; // System.out.print(X+"^"+n+"="+expRapide(X,n)); // System.out.println(" Compteur="+compteur2); // } System.out.println(exp(2,10)); System.out.println(expRapideAcc(2,10,1)); System.out.println(expRapideAccIter(2,10,1)); } }