Avez-vous des idées comment puis-je rendre mon programme plus efficace?
double ret= recPow(x,y/2) * recPow(x,y/2);
3 Réponses :
Une autre optimisation possible consiste à calculer recquet (x, y / 2) code> une seule fois.
Mais quand je le fais, une valeur réelle obtiendra une valeur réelle, puis la récursion s'arrêtera, ou fais-je quelque chose?
Vous appellez récursivement RCPOW avec Y / 2 à chaque appel. Cela a la belle propriété pour être O (log n).
if (y < 0)
return 1 / recPow (x, -y);
quandgpeow fait ça
Que fait ce code? Pourquoi est-ce une amélioration par rapport au code d'origine? Fournir un contexte et une explication aux réponses pour les rendre utiles.
La fonction doit renvoyer un entier, dans son code si (y <0), cela ne fait que appeler la fonction, il n'est pas nécessaire d'écrire une nouvelle fonction pour le faire.
QUINEGPEW est une fonction qui m'assiste à gérer le cas de l'exposant négatif. Je peux sûrement l'écrire comme vous l'avez fait.
La récursion n'est pas trop efficace par la conception - utilise intensément la pile. L'utilisation de la boucle est bien meilleure et plus efficace. L'algorithme ci-dessous doit être plus rapide (il utilise un maximum de 32 itérations uniquement):
#define INT_BITS (4 * 8)
double recPow(double x, int y) {
if (y == 0)
return 1.0;
if (y < 0)
return 1.0 / recPow(x, -y);
double res = 1.0;
int y1 = 0;
for (int i = 0; i < INT_BITS; i++) {
if (y & 0x1) {
res *= x;
y1++;
}
if (y == y1)
break;
x *= x;
y >>= 1;
y1 <<= 1;
}
return x;
}
retour x / 0; code> quoi?Cela retournera inf. Il a été demandé dans la paperasse. Rien à voir avec l'efficacité haha @edwardkarak