140 likes | 294 Views
RECURSIVITE PRESENTATION. Récursivité. Principe de base de la récursivité dans les langages de programmation Quelques exemples incontournables… Traitement récursif des listes Traitement récursif des arbres. Conditions d ’application. Définition récurrente d’un ensemble :
E N D
RECURSIVITE PRESENTATION Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Récursivité • Principe de base de la récursivité dans les langages de programmation • Quelques exemples incontournables… • Traitement récursif des listes • Traitement récursif des arbres Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Conditions d ’application • Définition récurrente d’un ensemble : Description des éléments de base + Règles de construction récursive • Les règles de construction récursives permettent de caractériser les éléments d'un ensemble à partir d'éléments plus simples du même ensemble (en général obtenus ou construits à l'étape précédente). • Il y a toujours un – ou plusieurs – éléments de base. Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Récursivité en informatique • En informatique les traitements récursifs doivent s ’appliquer à partir d’un modèle récursif cohérent. • S'il s'agit des éléments d'un ensemble, ils doivent être construits à partir d'une définition récursive et d'un élément de base. (Suite de fibonacci…) • S'il s'agit d'une méthode de résolution, le problème à résoudre doit se décomposer en sous-problèmes de même nature, et ce jusqu'à une formulation élémentaire (problème de base). Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Exemple de définition récurrente : Factorielle • Formule • Fact(0) = 1 , n = 0 ; • Fact(n) = 1*2*3…*n, n > 0 ; • Fonction C associée • long factit (int n) • { int fact=1; • while (n > 0) • { fact =fact*n; n--;} • return fact; • } • Récurrence Fact(0) = 1, n = 0; Fact(n) = Fact(n-1)*n, n > 0; Fonction C associée long factrec (int n) { if (n == 0) return 1; return n*factrec(n-1); } Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Suite de nombre de Fibonnacci • Définition : Fibo(1) = Fibo(2) = 1, Fibo(n) = Fibo(n-1) + Fibo(n-2) pour n > 2, • Fonction C associée int fibo (int n) { if ((n==1)||(n==2)) return 1; if (n>2) return (fibo(n-1)+fibo(n-2)); } Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Récursivité dans les langages de programmation • Dans les langages de programmation la récursivité est la possibilité donnée à une fonction (ou une procédure) à s’appeler (se rappeler) elle-même. • Les schémas de programmation qui en découlent sont en général plus simples et plus concis. • Le prix à en payer est en général une consommation mémoire à l’exécution plus importante et un temps de traitement plus long. Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Récursivité dite directe Une fonction qui s’appelle elle-même. • L’appel récursif est conditionné à un test. Les instructions de pré traitement se déroulent avant l’appel récursif. Les instruction de post traitement après l’appel récursif. • Attention les variables déclarées en local ne changent pas de valeur. • Les variables globales ou modifiées par leurs adresses peuvent ne plus avoir les mêmes valeurs avant et après l’appel récursif. Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Modèle de fonction récursive directe void recursive(void) { <instructions de pré-taitement> if (test arrêt) recursive() <instructions de post-traitement> } Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Modèle de fonctions récursives indirectes Récursivité indirecte Une fonction A appelle une fonction B. La fonction B appelle la fonction A. void recursiveA(void) { <instructions A1> if (test continuation B) recursiveB(); <instruction A2> } • void recursiveB(void) • { • <instructions B1> • if (test continuation A) • recursiveA(); • <instruction B2> • } Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Récursivité directe : exemple • Une fonction rec() qui s'appelle elle même 3 fois. • chaque nouvel appel conserve l'adresse de retour. • Les instructions de pré-traitement sont exécutées avant les appels récursifs. • Les instructions de post-traitement sont exécutées après les appels récursifs, dans l'ordre de dépilement, c'est à dire inverse. Ch. PAUL ALGORITHMIQUE Présentation de la récursivité
Récursive directe exemple avec 3 appels récursifs void rec(void) { <inst pré> if (cont) rec() <inst post> } • voidrec(void) • { <inst pré> • if (cont) rec() • <inst post> • } 1 2 • voidrec(void) • { <inst pré> • if (cont) rec() • <inst post> • } 3 6 5 4 appel récursif : branchement retour récursif : instruction suivante de la fonction appelante Ch. PAUL ALGORITHMIQUE Présentation de la récursivité