0
votes

Programme récursif pour l'efficacité de l'énergie

Avez-vous des idées comment puis-je rendre mon programme plus efficace?

double ret= recPow(x,y/2) * recPow(x,y/2);


2 commentaires

retour x / 0; quoi?


Cela retournera inf. Il a été demandé dans la paperasse. Rien à voir avec l'efficacité haha ​​@edwardkarak


3 Réponses :


2
votes

Une autre optimisation possible consiste à calculer recquet (x, y / 2) une seule fois. xxx


2 commentaires

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



1
votes
if (y < 0)
    return 1 / recPow (x, -y);

4 commentaires

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.



1
votes

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;
}


0 commentaires