Calcular potencia con recursividad

Iniciado por sora_ori, 8 Junio 2015, 21:00 PM

0 Miembros y 1 Visitante están viendo este tema.

sora_ori

Hola compañeros, estoy un poco confuso en como puedo realizar el siguiente ejercicio.

Tengo la siguiente función y tengo que calcular la potencia de forma recursiva:

función(x,n):
1 si n = 0
x si n = 1
(x^(n/2))^2 si n es par, n>1
x*(x^((n-1)/2))^2 si n es impar, n>2


Y bueno dejaré mi pobre código esperando un poco de ayuda  :rolleyes: :rolleyes:

#include<stdio.h>
#include<conio.h>

/* Declaración de funciones */
int potencia (int);

int main(void){
int n;

printf("Esribe un numero para calcular su potencia: ");
scanf("%i", &n);

printf("\nLa pontencia del numero %i es %i", n, potencia(n));

getch();
return 0;
}

int potencia(n){

if (n == 0) return 0;

if (n == 1) return 1;

if (n % 2 == 0){
(x^(n/2))^2
}
else{
x*(x^((n-1)/2))^2
}


}

Stakewinner00

Sin mirar mucho hay dos cosas que claramente están mal
Citar1 si n = 0
Citarif (n == 0) return 0;
aquí haces lo contrario, si n == 0 tendrías que devolver 1 no 0.

Y una función recursiva debe llamarse a si misma, y tu función potencia no lo hace, no es recursiva.

sora_ori

Gracias Stakewinner, lo voy entendiendo solo que al ver esa formula se me esta complicando.

Entonces ahora me quedaría así:

#include<stdio.h>
#include<conio.h>

/* Declaración de funciones */
int potencia (int);

int main(void){
int n;

printf("Esribe un numero para calcular su potencia: ");
scanf("%i", &n);

printf("\nLa pontencia del numero %i es %i", n, potencia(n));

getch();
return 0;
}

int potencia(n){

if (n == 0) return 1;

if (n == 1) return 0;

if (n % 2 == 0){
(potencia^(n/2))^2
}
else{
potencia*(potencia^((n-1)/2))^2
}

}

ivancea96

Mucho cuidado. Ahí es todo erróneo: El operador ^ en C y C++ no es potencia. Es el operador a nivel de bit XOR.
No hay un operador potencia para tipos básicos.

user-marcos

Puedes usar:
Código (cpp) [Seleccionar]

#include <cmath>
int num = pow(x,y);

sora_ori

Gracias a todos por vuestra respuestas!

He conseguido terminarlo pero creo que no como me pide el ejercicio.

#include<stdio.h>
#include<conio.h>

/* Declaración de funciones */
int potencia(int, int);

int main(void){
int base, exponente;

printf("Base: ");
fflush(stdin);
scanf("%i", &base);

printf("Exponente: ");
fflush(stdin);
scanf("%i", &exponente);

printf("\nLa pontencia del numero %i con exponente %i es %i", base, exponente, potencia(base, exponente));

getch();
return 0;
}

int potencia(int base, int exponente){
if (exponente  == 0) return 1;

else{
return base * potencia(base, exponente -1); // llamada recursiva
}
}

ivancea96

funcion(x,n):
1 si n = 0
x si n = 1
(x^(n/2))^2 si n es par, n>1
x*(x^((n-1)/2))^2 si n es impar, n>2


Puedes hacerlo como dice el ejercicio. en vez de K^2, puedes poner K*K, y las demás potencias, las haces recursivamente. Try it.

sora_ori

Gracias ivancea, pero no te he entendido, es decir, yo lo he conseguido hacer haciendo base * potencia(base, exponente -1) y en el ejercicio me lo pide de otras formas.


Saludos

Regexp

#8
Cita de: sora_ori en  8 Junio 2015, 23:38 PM
Gracias ivancea, pero no te he entendido, es decir, yo lo he conseguido hacer haciendo base * potencia(base, exponente -1) y en el ejercicio me lo pide de otras formas.


Saludos

Hola sora_ori, creo el ejercicio se basa en manejar bien los operadores aritméticos y las llamadas a funciones. Haciendo un poco al aire el asunto, creo que sería así


// [...] declaracion de funcion, main, prototipo, etc.
// [...] funcion potencia(x, n)
// n de tipo entero

// [...] Los condicionales basicos que ya hiciste, 1 si n=0 o x si n=1

// dejo el caso si n es par: (x^(n/2))^2
if ( n%2 == 0 ) return exponencial( exponencial(x, n/2), 2 );
// es decir, la base de la primera exponencial es una exponencial

// aca iría el caso si n no es par

// [...] fin de la función



Ya tienes una parte, falta que, basándote en el ejemplo que te dí, termines el ejercicio.  ;)

edit el ejercicio propone hacer una función recursiva para exponencial (entero), que se llame menos veces a sí misma.

Saludos
No todo el que deambula está perdido

sora_ori

Muchas gracias Regexp,

Esto es lo que he entendido:

if (exponente%2  == 0 ){
      return potencia( potencia(base, exponente/2),2);
   }