Aquí es lo que tengo para que mi solución:

 public int powerN(int base, int n) {

    if(n == 0)
       return 1;

    else if(n % 2 == 0)
       return base * base;

    else
       return base * powerN(base, n-1); 

 }

Sin embargo, si n > 3, a continuación, esta función no funciona.
Por ejemplo, powerN(2, 4) los rendimientos de 4 y powerN(2, 5) los rendimientos de 8.
Sé que una solución mucho más sencilla que existe, pero es solo que me molesta que no puedo entender por qué esto no está funcionando correctamente.

InformationsquelleAutor kachilous | 2011-05-05

10 Comentarios

  1. 4

    En pseudocódigo

    Me deja traducir el código en pseudocódigo:

    public int powerN(int base, int exponent)  {
        if the exponent is 0
            then return 1
        otherwise, if the exponent is even
            then return base * base
        otherwise
            base * powerN(base, exponent - 1)
    }

    La segunda rama tiene un error de lógica. Lo que su código está diciendo es esto: «siempre y cuando el exponente es par, el resultado debe ser base * base (que es, base al cuadrado)». Usted ya ha mencionado que este es el resultado que se obtiene al ejecutar el código.

    Cómo resolverlo

    Lo que usted probablemente querrá hacer es aumentar base a la mitad de la exponent (base * base * base * ... para exponent /2 veces), y luego multiplica ese número por sí mismo. De esa manera, se obtiene base multiplicado por sí mismo exponent veces.

    En pseudocódigo:

    otherwise, if the exponent is even
        then return powerN(base, exponent / 2) * powerN(base, exponent / 2)

    De manera realista, esto en realidad podría ser la siguiente:

    otherwise, if the exponent is even
        then {
            let x = powerN(base, exponent / 2)
            return x * x
        }

    Hecho. En su mayoría.

    Traducir eso a Java y quedará establecido.

    • Gracias por la detallada explicación. Después de haber trazado a través del código, tiene sentido el por que de que la declaración es necesaria.
  2. 5
    else if(n % 2 == 0)
       return base * base;

    Este bit es incorrecta — se devuelve el cuadrado de cualquier poder, no solo 2. Parece que está tratando de implementar el cuadrado y multiplicar de optimización. Así que si desea calcular powerN(base, n), ¿qué llamada recursiva puede hacer que aprovecha el hecho de que n es aún? ¿Qué nuevos valores que pase en la base y n? Uso de la identidad que b2n = (b2)n.

  3. 2

    Buggy código es:

    else if(n % 2 == 0)
       return base * base;

    este si se captura cada potencia de 2. Así 0,2,4,8 causa mal cálculo.

    La única caso de esquina que debe preocuparse es cuando n <= 0.

    Aquí es el código corregido:

    public static int powerN(int base, int n) {
        if (n < 0) {
            throw new IllegalArgumentException("Illegal Power Argument");
        }
        if (n == 0) {
            return 1;
        } else {
            return base * powerN(base, n - 1);
        }
    }

    Aquí está la prueba:

    public static void main(String args[]) throws NullPointerException {
        for (int i = 0; i < 10; i++) {
            System.out.println(powerN(2, i));
        }
    }

    y salida:

    run:
    1
    2
    4
    8
    16
    32
    64
    128
    256
    512
    BUILD SUCCESSFUL (total time: 1 second)
    • De verdad que no. El caso donde n ==2 es una importante optimización que guarda una recursividad.
  4. 1

    Incluso en el caso de que usted necesita base = powerN(base, n/2);antes de regresar.

    • Funcionó!! ¿Por qué tengo que añadir que la línea para que funcione?
    • Debido a la forma en que se fue que no dependen de n. Ahora estás computación b^(2k) como (b^k)^2, cuando n=2k.
  5. 0

    Para el cálculo de la potencia basta considerar el caso especial de x^0, para todos los demás (n>0), se puede utilizar la recursividad de x*powerN(x, n-1)

  6. 0
    class Square{
        int r=1;
         int power(int n, int p) throws Exception
        {
             int s=n;
            if(n<0||p<0)
            {
            throw new Exception("n and p must be positive");
            }
    
        if(p==2)
        {
            return n*n*r;
        }
        else
        {
            r=r*n;
            return power(n,p-1);
        }
    
        }
    }
  7. 0

    Aquí está la respuesta en C++, esta es una serie de a^b =

    int power(int a, int b)
    {
       int k = a;
       int c = b;
       if (c == 1)
        {
            return a;
        }
       else if (c == 0)
        {
            return 1;
        }
       else if (c >= 1)
       {
            c--;
            k = k*power(k,c);
       }
       cout << k << endl;
       return k;
    
    }
    
    int main()
    {
        cout << "Enter a number " << endl;
        int n;
        cin >> n;
        cout << "Enter power " << endl;
        int c1 = 0;
        cin >> c1;
        cout << endl ;
        cout << "These are all the powers up to " << n << " to the power " << c1 << endl;
        power(n,c1);
        return 0;
    }
  8. 0
    public static int powerN(int base, int n ){
        if (n==0){
            return 1;
        }else
            return base*powerN(base,n-1);
    }
    • Bienvenido a Desbordamiento de Pila! Mientras este fragmento de código se puede resolver el problema, no explica por qué o cómo se responde a la pregunta. Por favor, incluir una explicación de su código, ya que realmente ayuda a mejorar la calidad de tu post. Recuerde que usted está respondiendo a la pregunta para los lectores en el futuro, y esas personas pueden no saber las razones de su sugerencia de código.
  9. -1

    Su problema es el código

    if (n % 2 == 0)
    devolución de la base * base;

    Esto hace que su función de retorno de la plaza de la base whenevr la potencia (n) es par y cubo siempre es impar.
    La única condición de terminación necesidad de u es n==0 return 1 y se debe trabajar para su especificación de base a la potencia n de forma recursiva

  10. -1
    public int powerN(int base, int power) {
        if (power == 1)
            return base;
        else if (power % 2 == 0) {
            int x = powerN(base, power / 2);
            return x * x;
        } else {
            int x = powerN(base, (power - 1) / 2);
            return x * x * base;
        }
    }
    • Proporcionar una explicación de cómo este código resuelve el OP del problema. ¿Cuál es la diferencia de su código para el OP del código? ¿Cómo funciona el código de resolver el problema?

Dejar respuesta

Please enter your comment!
Please enter your name here