public class Fib { public static int compteur; public static int fib(int n,String prefixe) { compteur++; System.out.println(prefixe+" fib("+n+")"); if (n==0) return 1; if (n==1) return 1; return fib(n-1,prefixe+"-")+fib(n-2,prefixe+"-"); } public static void affiche(int []memoire) { for (int i=0; i<memoire.length; i++) { System.out.print(memoire[i]+" "); } System.out.println(); } public static int fibMemoisee(int []memoire,int n,String prefixe) { System.out.println(prefixe+" fibMemoisee("+n+")"); compteur++; if (memoire[n]!=0) return memoire[n]; int n1=0,n2=0; if (memoire[n-1]!=0) { // valeur déjà calculée n1 = memoire[n-1]; } else { // valeur non calculée précédemment n1 = fibMemoisee(memoire,n-1,prefixe+"-"); } if (memoire[n-2]!=0) { n2 = memoire[n-2]; } else { n2 = fibMemoisee(memoire,n-2,prefixe+"-"); } memoire[n] = n1+n2; affiche(memoire); return memoire[n]; } public static void main(String []a) { try { compteur = 0; int n = Integer.parseInt(a[0]); int [] memoire = new int[n+1]; memoire[0] = 1; memoire[1] = 1; int v = fibMemoisee(memoire,n,""); System.out.println("Fibonnacci("+n+")="+v); System.out.println("Nombre d'appels = "+compteur); } catch(Exception e) { } } }