La récursivité
Une récursivité: 3 points à concevoir! 1. Expression récursive du problème (récursion): L’ « équation » de la récursivité. Diviser pour régner n! = n x (n-1) x (n-2) x (n-3) x … x 1 = n x (n-1)! 2. Condition d’arrêt : Quand est-ce qu’on arrête les appels récursifs? 1! ou 0! 3. Convergence (vers la condition d’arrêt): Des conditions qui nous assure qu’un jour on va atteindre les conditions d’arrêt. si n = 0 ou n = 1 alors on a les conditions d’arrêt si n 2 alors la soustraction par 1 nous amènera vers n = 1 (n n-1 n-2 n-3 … 2 1) donc convergence si n 0
Récursivité : Diviser pour régner Structure générale d’une fonction récursive : { if(/* !condition de convergence */) exit(1); if(/*condition d’arrêt*/) return(/*Ce qu’elle doit retourné*/); else appel récursif } Traitement
Exemple: La factorielle (n!) long factorielle(int n) { if (n < 0)/* hypothèse de convergence : n 0 */ exit(1); if (n == 0 || n == 1) return 1; /* condition d’arrêt */ else /* appel récursif */ return n * factorielle(n - 1); }
Rappel sur la récursivité Voir les nombreux exercices corrigés, semaine4.
Récursivité et piles On peut simuler la pile d’exécution dans le cas d’une fonction récursive. On peut alors transformer une fonction récursive en fonction itérative avec gestion explicite d’une pile. Page 185 des notes de cours «Recette» pour traduire une fonction récursive en une fonction non-récursive (simuler la récursivité). Exemple (factoriel): semainier, semaine 4 (cet exemple fait partie du zip qui contient ces acétates). Exercice (tours de Hanoï): semainier, semaine 4. Voir le corrigé présent dans le zip!