2017-05-05 5 views
-2

J'essaye d'écrire une fonction dans java qui trouve le résultat d'un opérande élevé au pouvoir d'un autre.Trouver un nombre à la puissance d'un autre nombre?

I ne peut pas utiliser la fonction pow ou toute forme de boucle. Quelles sont les solutions possibles? J'ai essayé "^" et cela n'a pas fonctionné.

public static String raiseP(int op1, int op2){ 
    int result = op1^op2; //Doesn't Work 
    return result; 
} 

Y aurait-il un moyen de le faire en utilisant les mathématiques de base?

J'ai écrit:

public static int pow(int x, int y, int n, int z){ 
    if (y == n){ 
     System.out.println(z); 
     return z; 
    } 
    else{ 
     z = z*x; 
     n += 1; 
     pow(x,y,n,z); 
     return 0;  
    } 

} 
ex: pow(5,9,0,1) == 5^9 

mais ne suis pas autorisé à utiliser la récursivité.

+2

Etes-vous autorisé à utiliser des fonctions récursives? –

+1

s'il vous plaît montrer ce que vous avez essayé dans votre message. –

+3

Si vous ne pouvez utiliser aucune forme de boucles ou 'Math.pow' alors la seule autre option est la récursivité? –

Répondre

3

Sans être en mesure d'appeler Math.pow ou en utilisant des boucles, la seule autre possibilité utilise récursion:

public int powerFunction(int base, int exponent) { 
    if(exponent < 0){ throw new IllegalArgumentException("unsupported negative pow"); } 
    if(exponent == 0){ return 1; } 
    else{ 
     return base * powerFunction(base, exponent - 1); 
    } 
} 

appel powerFunction(2, 3) vous donnera: 1 * 2 * 2 * 2 = 8

+6

S'il vous plaît ne pas résoudre les devoirs des gens pour eux. Un bon indice est bon, même un lien vers un algorithme, mais fournir une implémentation pure et simple est généralement un mauvais service pour eux. En outre, cette approche n'est pas idéale, car le passage d'un exposant très haut a un potentiel de débordement de la pile. – dasblinkenlight

+0

La limitation avec ceci est l'hypothèse que l'exposant est un nombre entier positif. Toujours +1 –

+0

Oui, une vérification des exposants positifs est requise. 'si (exponent <0) lancer quelque chose'. – Raphael

0

la récursion pourrait vous aider:

public static int myPowerRec(int op1, int op2, int res) { 
    if (op2 == 0) { 
    return res; 
    } 
    else { 
    return (myPowerRec(op1, op2 - 1, op1 * res)); 
    } 
} 

vous devrez initialiser res à 1 (myPowerRec(23, 2, 1) vous donnera 1 * 23 * 23). Cette récursivité est appelée tail recursion et vous permettra d'utiliser cette fonction sans problème de pile.

Attention, vous devez vérifier la valeur op2 avant.

+0

c'est assez bon mais java supporte-t-il l'optimisation d'appel de queue? – Raphael

+0

En effet, je n'ai pas vérifié, Java n'est pas ma langue principale. – Ankirama

0

En utilisant une boucle:

public static int power(a, b) { // a^b 
    int p = 1; 
    for (int i = 1, i <= b; i++) 
    p *= a; 
    return p; 
} 
+0

Je ne peux pas utiliser les boucles –

1

Vous pouvez simplement utiliser que

pow(x,y) = exp(y*log(x)) 

qui fait également partie de la mise en œuvre de la fonction d'alimentation dans la bibliothèque de mathématiques.