Adloun

programmation Java (école d'ingénieur) · Chapitre 4 · Application directe du cours

Puissance rapide

Méthodes · niveau 3 (difficile)

Énoncé

La méthode puissance du cours effectue appels pour calculer . On remarque que si est pair et si est impair.

  • Écrire une méthode récursive static long puissanceRapide(long x, int n) fondée sur cette remarque, qui ne fait qu'un seul appel récursif.
  • Compter les appels pour et pour , et comparer avec la version du cours.
  • Un camarade écrit return puissanceRapide(x, n / 2) * puissanceRapide(x, n / 2); dans le cas pair. Le résultat est-il juste ? Qu'a-t-il perdu ?

Corrigé


static long puissanceRapide(long x, int n) {
    if (n == 0) return 1;
    long y = puissanceRapide(x, n / 2);        // UN seul appel récursif
    if (n % 2 == 0) return y * y;
    return x * y * y;
}

Chaque appel divise par deux : on passe par , soit appels contre pour la version du cours. Pour : appels contre . Le nombre d'appels est de l'ordre de , au lieu de . Mesures du programme :


3^20 = 3486784401 (21 appels) = 3486784401 (6 appels)
puissanceRapide(1, 1000) : 11 appels
puissanceNaive(1, 1000) : 1001 appels

La version du camarade donne le bon résultat, mais elle fait deux appels récursifs identiques : le nombre d'appels double à chaque niveau, et l'on retombe sur environ appels. Tout le gain vient de ce que l'on mémorise dans une variable pour ne le calculer qu'une fois.

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 →