algorithmique (école d'ingénieur) · Chapitre 1 · Application directe du cours
La récursivité naïve
Glouton ou dynamique ? · niveau 2
Énoncé
On programme la récurrence de Zébulon « directement » :
static int m(int[] R, int j) {
if (j == 0) return R[0];
if (j == 1) return MOINS_INFINI;
if (j == 2) return R[0] + R[2];
return Math.max(m(R, j-2), m(R, j-3)) + R[j];
}
- Montrer que le nombre d'appels provoqués par l'appel
m(R, j)vérifie . - Calculer pour . Conclure.
- (Mémoïsation) Modifier la fonction pour qu'elle mémorise dans un tableau les valeurs déjà calculées. Combien d'appels fait-elle alors pour ? Quelle est sa complexité ?
Corrigé
- Pour , l'appel ne provoque aucun autre appel : . Pour , l'appel
m(R, j)compte pour un, puis provoque l'appelm(R, j-2)(qui en provoque au total) et l'appelm(R, j-3)( au total) : . - On calcule par la récurrence elle-même (et on vérifie par un compteur placé dans la fonction) :
a(20) = 399
a(40) = 110809
a(60) = 30693571
a(80) = 8501898223
Le nombre d'appels est multiplié par environ chaque fois que augmente de : croissance exponentielle (en , comme le nombre de chemins). Pour , plus de huit milliards d'appels pour calculer 81 valeurs. La fonction recalcule sans cesse les mêmes .
- On ajoute un tableau
Integer[] memo, initialement rempli denull:
static int mMemo(int[] R, int j, Integer[] memo) {
if (memo[j] != null) return memo[j]; // déjà calculée
int v;
if (j == 0) v = R[0];
else if (j == 1) v = MOINS_INFINI;
else if (j == 2) v = R[0] + R[2];
else v = Math.max(mMemo(R, j-2, memo), mMemo(R, j-3, memo)) + R[j];
memo[j] = v; // mémorisée une fois pour toutes
return v;
}
Pour , le compteur affiche appels. Chaque valeur n'est calculée qu'une fois, et chaque calcul provoque au plus deux appels : la complexité est , comme celle de calculerM. La mémoïsation est la version « descendante » de la programmation dynamique ; le tableau rempli par croissants en est la version « ascendante ».
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.