es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de Desbordamiento de Pila Durante la Recursión Paralela

Estoy usando una recursión paralela para evaluar si un número es par o impar. Utilicé el tipo long pero estoy teniendo un error de StackOverflowError cuando el número de entrada(x) tiene 5 o más dígitos. No entiendo por qué.

static boolean Odd(long n) {
if (n == 0) return false;
else return Even(n - 1);     
}

static boolean Even(long d) {
if (d == 0) return true;
else return Odd(d - 1);  
}

public static void main(String[] args) {
    long x = 0; 
    while(x>=0) {
        System.out.println("Insert number");
        x = SavitchIn.readLong();
        boolean isOdd = Odd(x);
        if(isOdd) {
            System.out.println("Odd number");
        }else {
            System.out.println("Even number");
    }
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que se produce un error de StackOverflow cuando el número de entrada (x) tiene 5 dígitos o más es porque la recursión paralela consume memoria de pila exponencialmente. Cada llamada recursiva agrega un nuevo marco de pila, y el número de marcos se duplica con cada nivel de recursión. Cuando el número de entrada (x) tiene 5 dígitos o más, el número de llamadas recursivas se vuelve tan grande que supera el tamaño máximo de la pila, lo que causa un error de StackOverflow.

    Para evitar el error de StackOverflow, se puede utilizar un enfoque iterativo en lugar de recursivo. Por ejemplo, se puede utilizar la manipulación de bits para comprobar si el bit menos significativo del número está establecido o no. Si está establecido, entonces el número es impar, de lo contrario es par.

    Aquí hay un ejemplo del enfoque iterativo:

    static boolean isOdd(long n) {
        return (n & 1) == 1;
    }
    
    public static void main(String[] args) {
        long x = 0; 
        while(x >= 0) {
            System.out.println("Insert number");
            x = SavitchIn.readLong();
            boolean isOdd = isOdd(x);
            if(isOdd) {
                System.out.println("Odd number");
            } else {
                System.out.println("Even number");
            }
        }
    }
    

    Este enfoque utiliza la manipulación de bits (n & 1) para comprobar si el bit menos significativo del número está establecido o no. Si está establecido (es decir, el resultado es 1), entonces el número es impar, de lo contrario es par. Este enfoque no utiliza la recursión, por lo que no consume memoria de pila exponencialmente y, por lo tanto, no se encuentra con el error de StackOverflow.

Comments are closed.