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
- 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.