pour n∈N. Bien sûr, on s’interdira d’utiliser la fonction puissance (ˆ) de Maple : on est justement en
train d’en donner une implémentation !
La méthode d’exponentiation rapide consiste à remarquer que, pour tout entier n∈N, on a les
relations
a2n= (a2)net a2n+1 =a·(a2)n
(autrement dit, selon que nest pair ou impair, on a an=··· ou an=···). Cette méthode est beaucoup
plus efficace : elle ramène le calcul d’une puissance n-ème à un calcul de puissance dont l’exposant est
deux fois plus petit. Par exemple, pour calculer a1024, il n’y a plus besoin de 1023 multiplications, mais
uniquement de 10 : on élève aau carré, puis le résultat au carré, puis... ceci 10 fois de suite.
Écrire maintenant une procédure récursive puissrapide à deux paramètres utilisant cette remarque
pour calculer an. Utiliser une variable globale compteur, initialisée à 0 avant d’appeler la procédure, qui
comptera le nombre de multiplications effectuées pour calculer anpar cette méthode. Donner également
un majorant de ce nombre en fonction de n.
4 Coefficients binomiaux
Écrire deux procédures récursives calculant les coefficients binomiaux n
p: la première utilisant la
relation de Pascal, la seconde la relation n
p=n
pn−1
p−1. Commencer par réfléchir à l’initialisation avant
de coder. En utilisant à nouveau une variable globale, comparer le nombre d’opérations nécessaires en
utilisant l’une et l’autre méthode.
5 La suite de Fibonacci
On rappelle la définition de la suite de Fibonacci :
F0= 0, F1= 1 et ∀n∈N, Fn+2 =Fn+1 +Fn.
Écrire une procédure récursive Fibo calculant Fn. Calculer F10,F20,F30 grâce à cette procédure. Est-il
raisonnable d’espérer calculer F40 avant la fin de la séance ?
La raison de cette inefficacité est que, pour calculer Fn, la procédure Fibo fait non pas un mais deux
appels à elle-même, qui eux-même vont faire chacun deux nouveaux appels à la procédure Fibo... Vérifiez-
le en « traçant » la procédure Fibo (debug(Fibo)).
Autrement dit, le problème vient de la définition de la suite par récurrence : c’est une définition de la
forme
Fn+1 =f(Fn, Fn−1)
et non
xn+1 =f(xn)
comme sur les exemples précédents. Une façon de contourner le problème est d’utiliser l’option remember,
mais c’est peu élégant car on est obligé de stocker de nombreuses valeurs.
5.1 D’une récurrence double à une récurrence simple
Une façon plus astucieuse est de se ramener à une suite récurrente dont chaque terme dépend unique-
ment du précédent. C’est le cas de la suite
xn= (Fn, Fn+1),
qui vérifie la relation de récurrence xn+1 =f(xn), où fest la fonction
f:R2−→ R2
(u, v)7−→ (v, u +v)
.
Nous allons donc écrire une procédure récursive, Fibocouple, qui calcule la liste [Fn, Fn+1 ] pour tout
entier n, en utilisant cette relation de récurrence. Ainsi, le résultat de l’appel à Fibocouple(n) sera
une liste, dont les éléments seront respectivement Fnet Fn+1 , que l’on obtiendra par les commandes
Fibocouple(n)[1] et Fibocouple(n)[2]. La relation de récurrence à utiliser est donc
Fibocouple(n) = f(Fibocouple(n-1)).
On code
2