Vous êtes sur la page 1sur 2

I3a - TD1

Récursivité

1 Factorielle
On considère plusieurs variantes récursives de fonctions calculant n!.

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 à fibo nécessaires pour calculer
Fn .
3. Proposez une fonction récursive fibo1 permettant de calculer Fn 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
p
La valeur Cn = 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
 0
 Cn = 1, n≥0
n
C = 1, n≥0
 np p p−1
Cn = Cn−1 +Cn−1 , n ≥ 0, 0 < p < n

Ou encore
Cnn = 1,

n≥0
p n p
Cn = n−p Cn−1 , n ≥ 0, 0 < p < n
p
1. Donnez une implentation en java de deux fonctions permettant de calculer Cn 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
p
d’appels de fonction nécéssaires pour calculer Cn .
3. En vous basant sur la première relation de récurrence donnée, implantez en java une
p
fonction itérative calculant efficacement Cn en utilisant un tableau à une dimension.

4 Enumération de combinaisons
Pour tout ensemble fini E, on note (dans cet exercice) C p (E) l’ensemble de toutes les
parties de E 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écifier C p (E) en fonction d’un élément quel-
conque x de E, de C p−1 (E \ {x}) et de C p (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 forme static 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".

Vous aimerez peut-être aussi