Adloun

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'appel m(R, j-2) (qui en provoque au total) et l'appel m(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 de null :

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

Exercice suivant et tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →