Exercices : 1 2 3 4 5
Regarder la correction uniquement après avoir travaillé par vous-même, car si vous ne le faites pas, c’est le meilleur moyen de rater vos DS/CC.
Exercice 1
On crée la version itérative du programme 1
2
3
4
5
6
7
8
int powerIt ( int a , int b ) {
int result = 1 ;
for ( int i = 0 ; i < b ; i ++ ) {
result *= a ;
}
return result ;
}
On crée maintenant la version récursive du programme 1
2
3
4
5
6
7
int powerRec ( int a , int b ) {
if ( b == 0 ) {
return 1 ;
}
return a * powerRec ( a , b - 1 );
}
On dessine l’arbre de récursion de la fonction flowchart
n1(["powerRec(3,4)"])
n1 --- n2(["3 * powerRec(3,3)"])
n2 --- n3(["3 * powerRec(3,2)"])
n3 --- n4(["3 * powerRec(3,1)"])
n4 --- n5(["3 * powerRec(3,0)"])
n7(["3*3*3*3*1"])
n7 --- n8["3*3*3*1"]
n8 --- n9["3*3*1"]
n9 --- n10["3*1"]
n10 --- n11["1"]
powerRec(3,4)
3 * powerRec(3,3)
3 * powerRec(3,2)
3 * powerRec(3,1)
3 * powerRec(3,0)
3*3*3*3*1
3*3*3*1
3*3*1
3*1
1
Exercice 2
On crée la fonction recursive selon la formule du coefficient binomial 1
2
3
4
5
6
int coefficientBinomial ( int n , int p ) {
if ( p == 0 || p == n )
return 1 ;
return coefficientBinomial ( n - 1 , p - 1 ) + coefficientBinomial ( n - 1 , p );
}
Exercice 3
On affiche le tableau de manière récursive : 1
2
3
4
5
6
7
8
9
void printArray ( int arr [], int size ) {
if ( size == 0 ) {
printf ( " \n " );
return ;
}
printf ( "%d " , arr [ size - 1 ]);
printArray ( arr , size - 1 );
}
Trouver le maximum d’un tableau de manière récursive : 1
2
3
4
5
6
int findMax ( int arr [], int size ) {
if ( size == 1 )
return arr [ 0 ];
return max ( arr [ size - 1 ], findMax ( arr , size - 1 ));
}
Compter le nombre d’éléments divisibles par 3 dans un tableau de manière récursive (en partant du début) : 1
2
3
4
5
6
int compterdivisible3debut ( int arr [], int size ) {
if ( size == 0 )
return 0 ;
return ( arr [ 0 ] % 3 == 0 ) + compterdivisible3debut ( arr + 1 , size - 1 );
}
3.b Compter le nombre d’éléments divisibles par 3 dans un tableau de manière récursive (en partant du fin) : 1
2
3
4
5
6
int compterdivisible3fin ( int arr [], int size ) {
if ( size == 0 )
return 0 ;
return ( arr [ size - 1 ] % 3 == 0 ) + compterdivisible3fin ( arr , size - 1 );
}
Exercice 4
Fonction itérative sommeEntiers : 1
2
3
4
5
6
7
8
int sommeEntiers ( int a , int b ) {
int sum = 0 ;
for ( int i = a ; i <= b ; i ++ ) {
sum += i ;
}
return sum ;
}
Définition récursive avec somme croissante : 1
2
3
4
5
6
int sommeEntiersCroissant ( int a , int b ) {
if ( a == b )
return a ;
return a + sommeEntiersCroissant ( a + 1 , b );
}
Définition récursive avec somme décroissante : 1
2
3
4
5
6
int sommeEntiersDecroissant ( int a , int b ) {
if ( a == b )
return a ;
return b + sommeEntiersDecroissant ( a , b - 1 );
}
Pour tester les fonctions de l’exercice 4 avec des valeurs de paramètres aléatoires entre 100 et 200, on fait : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main () {
srand ( time ( NULL )); // Initialisation de la graine pour les nombres aléatoires (ne pas oublier d'importer stdlib)
int a = rand () % 101 + 100 ; // Valeur aléatoire entre 100 et 200 pour 'a'
int b = rand () % 101 + 100 ; // Valeur aléatoire entre 100 et 200 pour 'b'
printf ( "Paramètres a = %d, b = %d \n " , a , b );
// Test de la fonction sommeEntiers
int sum1 = sommeEntiers ( a , b );
printf ( "Somme des entiers entre %d et %d : %d \n " , a , b , sum1 );
// Test de la fonction sommeEntiersCroissant
int sum2 = sommeEntiersCroissant ( a , b );
printf ( "Somme des entiers entre %d et %d (croissant) : %d \n " , a , b , sum2 );
// Test de la fonction sommeEntiersDecroissant
int sum3 = sommeEntiersDecroissant ( a , b );
printf ( "Somme des entiers entre %d et %d (décroissant) : %d \n " , a , b , sum3 );
return 0 ;
}
Exercice 5
Version itérative (marche avec tout les chiffres): 1
2
3
4
5
6
7
8
9
int sommeChiffres ( int n ) {
int somme = 0 ;
while ( n != 0 ) {
somme += n % 10 ;
n /= 10 ;
}
return somme ;
}
Version récursive non terminale : 1
2
3
4
5
6
int sommeChiffresRecursive ( int n ) {
if ( n == 0 )
return 0 ;
return ( n % 10 ) + sommeChiffresRecursive ( n / 10 );
}
Arbre de récursivité de la fonction récursive non terminale pour 6053 : flowchart
n1(["sommeChiffresRecursive(6053)\n"])
n1 --- n2(["3 + sommeChiffresRecursive(605)\n"])
n2 --- n3(["5 + sommeChiffresRecursive(60)\n"])
n3 --- n4(["0 + sommeChiffresRecursive(6)\n"])
n4 --- n5(["6 + sommeChiffresRecursive(0)\n"])
n5 --- n6(["0"])
sommeChiffresRecursive(6053)
3 + sommeChiffresRecursive(605)
5 + sommeChiffresRecursive(60)
0 + sommeChiffresRecursive(6)
6 + sommeChiffresRecursive(0)
0
Version récursive terminale : 1
2
3
4
5
6
7
8
9
10
11
int sommeChiffresTailRecursive ( int n , int total ) {
if ( n == 0 )
return total ;
return sommeChiffresTailRecursive ( n / 10 , total + n % 10 );
}
int sommeChiffres ( int n ) {
return sommeChiffresTailRecursive ( n , 0 );
}
Exercices : 1 2 3 4 5
Le contenu de cet article est la propriété exclusive de son auteur.