Une fonction récursive est une fonction qui s’appelle elle-même pour résoudre un problème en le décomposant en sous-problèmes plus petits. C’est une technique courante en programmation, souvent utilisée pour des problèmes tels que les algorithmes de recherche, le calcul de factorielle, le tri, ou les arbres binaires.
L’idée principale de la récursivité est de diviser un problème complexe en plusieurs sous-problèmes plus simples. Une fonction récursive doit avoir deux parties :
Voici la structure d’une fonction récursive typique en C :
type fonction_recursive(paramètres) {
if (condition d'arrêt) {
// Cas de base
return valeur;
} else {
// Appel récursif
return fonction_recursive(paramètres modifiés);
}
}
La factorielle d’un nombre entier n
(notée n!
) est définie comme le produit de tous les entiers de 1 à n
. Par exemple, 5! = 5 * 4 * 3 * 2 * 1 = 120
. La factorielle peut être calculée de manière récursive, car :
0! = 1
n! = n * (n - 1)!
#include <stdio.h>
// Fonction récursive pour calculer la factorielle
int factorielle(int n) {
if (n == 0) {
return 1; // Cas de base : 0! = 1
} else {
return n * factorielle(n - 1); // Appel récursif
}
}
int main() {
int nombre = 5;
printf("La factorielle de %d est %d\n", nombre, factorielle(nombre));
return 0;
}
n == 0
, la fonction retourne 1 (ce qui termine la récursion).n > 0
, la fonction s’appelle elle-même avec n - 1
, et la multiplication continue jusqu’à atteindre le cas de base.factorielle(3)
:factorielle(3)
appelle factorielle(2)
factorielle(2)
appelle factorielle(1)
factorielle(1)
appelle factorielle(0)
(cas de base)factorielle(0)
retourne 1factorielle(1)
retourne 1 * 1 = 1
factorielle(2)
retourne 2 * 1 = 2
factorielle(3)
retourne 3 * 2 = 6
Écrivez une fonction récursive pour calculer la somme des éléments d’un tableau.
#include <stdio.h>
int somme(int tableau[], int taille) {
if (taille == 0) {
return 0; // Cas de base : un tableau vide a une somme de 0
} else {
return tableau[taille - 1] + somme(tableau, taille - 1); // Appel récursif
}
}
int main() {
int tableau[] = {1, 2, 3, 4, 5};
int taille = sizeof(tableau) / sizeof(tableau[0]);
printf("La somme des éléments du tableau est : %d\n", somme(tableau, taille));
return 0;
}
La série de Fibonacci est définie de la manière suivante :
F(0) = 0
F(1) = 1
n ≥ 2
, F(n) = F(n-1) + F(n-2)
#include <stdio.h>
// Fonction récursive pour calculer le n-ième terme de Fibonacci
int fibonacci(int n) {
if (n == 0) {
return 0; // Cas de base : F(0) = 0
} else if (n == 1) {
return 1; // Cas de base : F(1) = 1
} else {
return fibonacci(n - 1) + fibonacci(n - 2); // Appel récursif
}
}
int main() {
int n = 5;
printf("Le %d-ième terme de Fibonacci est %d\n", n, fibonacci(n));
return 0;
}
n
est 0 ou 1, la fonction retourne respectivement 0 ou 1.n ≥ 2
, la fonction retourne la somme des deux termes précédents (fibonacci(n-1)
et fibonacci(n-2)
).fibonacci(3)
:fibonacci(3)
appelle fibonacci(2)
et fibonacci(1)
fibonacci(2)
appelle fibonacci(1)
et fibonacci(0)
fibonacci(1)
retourne 1 et fibonacci(0)
retourne 0fibonacci(2)
retourne 1 + 0 = 1
fibonacci(3)
retourne 1 + 1 = 2
La recherche binaire est un algorithme efficace pour trouver un élément dans un tableau trié. L’algorithme divise le tableau en deux parties à chaque étape et compare l’élément du milieu avec l’élément recherché.
#include <stdio.h>
// Fonction récursive pour la recherche binaire
int recherche_binaire(int tableau[], int gauche, int droite, int cible) {
if (gauche > droite) {
return -1; // Cas de base : l'élément n'est pas trouvé
}
int milieu = gauche + (droite - gauche) / 2; // Calculer l'indice du milieu
if (tableau[milieu] == cible) {
return milieu; // L'élément est trouvé
} else if (tableau[milieu] > cible) {
return recherche_binaire(tableau, gauche, milieu - 1, cible); // Recherche dans la partie gauche
} else {
return recherche_binaire(tableau, milieu + 1, droite, cible); // Recherche dans la partie droite
}
}
int main() {
int tableau[] = {1, 3, 5, 7, 9, 11};
int taille = sizeof(tableau) / sizeof(tableau[0]);
int cible = 7;
int resultat = recherche_binaire(tableau, 0, taille - 1, cible);
if (resultat != -1) {
printf("Élément trouvé à l'indice %d\n", resultat);
} else {
printf("Élément non trouvé\n");
}
return 0;
}
gauche
dépasse droite
, l’élément n’est pas dans le tableau.recherche_binaire(tableau, gauche, milieu - 1, cible)
). Sinon, on effectue l’appel récursif sur la partie droite du tableau (recherche_binaire(tableau, milieu + 1, droite, cible)
).Ce programme permet de rechercher efficacement un élément dans un tableau trié, en divisant l’espace de recherche à chaque étape.
for
, while
) sont souvent plus efficaces en termes de mémoire et de temps d’exécution, car elles n’utilisent pas la pile d’appel.Exemple : Le calcul de la factorielle peut être fait de manière itérative ou récursive.
Itératif :
#include <stdio.h>
int factorielle_iterative(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int n = 5;
printf("La factorielle de %d est %d\n", n, factorielle_iterative(n));
return 0;
}
Récursif :
#include <stdio.h>
int factorielle_recursive(int n) {
if (n == 0) {
return 1;
} else {
return n * factorielle_recursive(n - 1);
}
}
int main() {
int n = 5;
printf("La factorielle de %d est %d\n", n, factorielle_recursive(n));
return 0;
}
Différences :
for
pour calculer la factorielle, tandis que l’approche récursive divise le problème en sous-problèmes plus petits jusqu’à atteindre le cas de base.Les fonctions récursives sont un outil puissant dans la boîte à outils d’un programmeur. Elles sont particulièrement utiles pour résoudre des problèmes où la solution peut être formulée en termes de sous-problèmes plus petits, comme le tri (quicksort, mergesort), la gestion des structures arborescentes (arbres binaires), ou la recherche dans des algorithmes divisant pour régner (recherche binaire).
Cependant, la récursion doit être utilisée avec soin. Il est essentiel de bien définir le cas de base pour éviter les appels récursifs infinis, et de comprendre les implications en termes de performances et de mémoire. Dans certains cas, une solution itérative peut être plus adaptée, en particulier lorsque la récursion pourrait entraîner un dépassement de pile.
En résumé, la récursion est une technique élégante et puissante pour résoudre certains problèmes, mais elle doit être appliquée de manière judicieuse et en tenant compte de ses limitations.
Les écarts sur charges fixes permettent d'analyser les différences entre les charges fixes budgétées et…
L’écart-type est une mesure de la dispersion des données autour de la moyenne. Excel propose…
Exercice 1 : Calcul des Écarts sur Volume et Prix Contexte :Une entreprise a prévu…
1. Généralités sur le Contrôle Budgétaire Question 1 : Quel est l’objectif principal du contrôle…
Voici un QCM Contrôle de Gestion - Pilotage de la Performance bien conçu sur le…
Une fiche d’action est un outil essentiel pour planifier, suivre et gérer les tâches dans…
This website uses cookies.