fibon(a,b,n):={ local k,uk; for (k:=2;k<=n;k++) { uk:=a+b; a:=b; b:=uk; } return uk; }On écrit pour avoir u0, u1...un:
fibona(a,b,n):={ local k,uk,res; res:=a,b; for (k:=2;k<=n;k++) { uk:=a+b; a:=b; b:=uk res:=res,uk; } return res; }On écrit pour avoir uc, uc+1...un pour c
fibonac(a,b,c,n):={ local k,uk,res; for (k:=2;k<c;k++) { uk:=a+b; a:=b; b:=uk }; if c>1 res:=NULL else if c==0 {res:=a,b;c:=2;} else if c==1 {res:=b;c:=2}; for (k:=c;k<=n;k++) { uk:=a+b; a:=b; b:=uk res:=res,uk; } return res; }Remarque On peut bien sûr écrire un programme récursif qui donne la valeur de un. Mais cela n'est pas efficace car on calcule plusieurs fois le même terme. Car par exemple pour calculer u5 on doit calculer u3 et u4 et pour calculer u4, il faudra à nouveau calculer u3 et u2, donc u3 sera calculé 2 fois et u2 sera calculé 3 fois. Pour s'en rendre compte on peut imprimer les valeurs des variables pour chacun des appels récursifs.
On a :
u0 = u0
u1 = u1
un = un-1 + un-2 pour n 2
Donc
fibonr(u0,u1,n):={ if (n==0) {print(u0,u1,n);return u0;} if (n==1) {print(u0,u1,n)return u1;} print(u0,u1,n) return fibonr(u0,u1,n-2)+fibonr(u0,u1,n-1); }:;On peut aussi compter le nombre de fois que la fonction a èté appelée c'est à dire le nombre de print du programme fibonr précédent:
fibona(u0,u1,n):={ if (n==0) {return [u0,1];} if (n==1) {return [u1,1];} print(u0,u1,n) return fibona(u0,u1,n-2)+fibona(u0,u1,n-1)+[0,1]; }On tape : fibona(1,1,6)