I3a - TD1
Récursivité
1 Factorielle
On considère plusieurs variantes récursives de fonctions calculantn!.
fact1(n : entier)
si n<2 alors retourner 1 sinon retourner n*fact1(n-1) fact2(n : entier)
si n<2 alors retourner 1 sinon retourner fact2(n-1)*n fact3(n : entier)
si n<2 alors retourner 1
sinon si n<3 alors retourner 2 sinon retourner fact3(n-2)*(n-1)*n //utilisation : fact4(1,n)
fact4(acc : entier, n : entier) si n<2 retourner acc
sinon retourner fact4(acc*n, n-1)
Pour chacune de ces variantes, répondez aux questions suivantes : 1. S’agit il d’une récursivité terminale ?
2. Donnez par ordre chronologique les multiplications effectuées pour calculer 6!.
3. Combien d’appels à la fonction sont ils nécessaires pour calculer 10! ?
2 Fibonacci
On rappelle que la suite de Fibonacci est définie par :
F0 = 0 F1 = 1
Fn = Fn−1+Fn−2, n>1 On considère la fonction récursive suivante :
fibo(n)
si n<2 alors retourner n
sinon retourner fibo(n-1) + fibo(n)
1. Simulez l’exécution de fibo(5) en détaillant les appels récursifs, les valeurs des paramètres et les valeurs de retour de ces appels.
2. Exprimez, en fonction de n, le nombre d’appels à fibonécessaires pour calculer Fn.
3. Proposez une fonction récursive fibo1permettant de calculerFn en utilisant uni- quement la récursivité terminale. Cette procédure présente t-elle un intérêt par rap- port à une procédure itérative réalisant le même calcul ?
3 Dénombrement de combinaisons
La valeurCnp=n!/p!(n−p)! est le nombre de sous-ensembles possibles de p élé- ments dans un ensemble de néléments. On peut définir cette fonction par récurrence de plusieurs manières. Par exemple
Cn0 = 1, n≥0
Cnn = 1, n≥0
Cnp = Cn−1p +Cn−1p−1, n≥0,0<p<n Ou encore
Cnn = 1, n≥0 Cnp = n−npCn−1p , n≥0,0<p<n
1. Donnez une implentation en java de deux fonctions permettant de calculerCnp en utilisant respectivement les deux relations de récurences explicitée plus haut. Quelle est la précaution à prendre pour éviter des erreurs d’arrondi dans la deuxième fonc- tion ?
2. Pour chacune des deux implantations, exprimez en fonction de n et p le nombre d’appels de fonction nécéssaires pour calculerCnp.
3. En vous basant sur la première relation de récurrence donnée, implantez en java une fonction itérative calculant efficacementCnpen utilisant un tableau à une dimension.
4 Enumération de combinaisons
Pour tout ensemble finiE, on note (dans cet exercice)Cp(E)l’ensemble de toutes les parties deE de cardinal p.
1. En vous inspirant des relations de récurrences de l’exercice précédent, donnez une relation de récurrence permettant de spécifierCp(E)en fonction d’un élément quel- conquexdeE, deCp−1(E\ {x})et deCp(E\ {x}).
2. En vous basant sur cette récurrence, écrivez une méthode java affichant à l’écran toutes la parties de p éléments d’un ensemble E. Par commodité, la méthode à réaliser sera de la formestatic void generer(String E, String F, int p) et devra afficher toutes les chaînes comportant tous les caractères de F et p ca- ractères de E. Par exemple, generer ("abcd","",2) devra afficher les chaînes
"ab","ac","ad","bc","bd","cd".