Acabo de comenzar a aprender Java para la universidad con algunos ejercicios. No soy nuevo en programación, solo en Java. He seguido todas las instrucciones, pero la función de retorno de Java hace algunas cosas realmente extrañas. He insertado algunas salidas de depuración para comprender mejor el código. Se incluye la salida CMD del programa.

Pensé que la función terminaría directamente después del regreso. Pero, ¿por qué no lo hace en este caso?

public class Rekursion {

    public static void main(String[] args) {
        int zahl = 10;
        System.out.println("debugStart");
        boolean even = isEven(zahl);
        System.out.println("debugEnd");

        if (even == true) {
            System.out.println(zahl + " is even");
        } else {
            System.out.println(zahl + " is uneven");
        }
    }

    public static boolean isEven(int n) {
        System.out.println(n);
        if (n > 1) {
            System.out.println("debugx");
            isEven(n - 2);
        }

        if (n == 0) {
            System.out.println("debug1");
            return true;
        } else if (n == 1) {
            System.out.println("debug2");
            return false;
        } else {
            System.out.println("ERROR");
            return false;
        }
    }
}

Salida (cmd):

debugStart
10
debugx
8
debugx
6
debugx
4
debugx
2
debugx
0
debug1

El programa debe detenerse aquí, normalmente. Pero continúa ...

ERROR
ERROR
ERROR
ERROR
ERROR
debugEnd
10 is uneven
4
Johnny 10 sep. 2018 a las 12:19

3 respuestas

La mejor respuesta

También debe return la llamada de recursión,

 if(n>1){
     System.out.println("debugx");
     return isEven(n-2);//return at this point
 }

Como no ha regresado, sus llamadas recursivas están llegando a else declaraciones, por lo tanto, devuelven false.

9
Praveen 18 ene. 2019 a las 14:36

Código corregido :

public class Rekursion{

public static void main(String[] args){
    int zahl = 10;
    System.out.println("debugStart");
    boolean even = isEven(zahl);
    System.out.println("debugEnd");

    if(even == true){
        System.out.println(zahl+" is even");
    }

    else{
        System.out.println(zahl+" is uneven");
    }
}

public static boolean isEven(int n){
    System.out.println(n);
    if(n>1){
        System.out.println("debugx");
        return isEven(n-2);
    }

    if (n == 0) {
        System.out.println("debug1");
        return true;
    }

    else if (n == 1) {
        System.out.println("debug2");
        return false;
    }

    else{
        System.out.println("ERROR");
        return false;
    }
}

}

Se agregó la declaración return.

1
Raj 10 sep. 2018 a las 09:27

Estoy bastante seguro de que olvidó agregar la declaración return antes de isEven(n-2).

Entonces, el código corregido del método isEven () sería así:

public static boolean isEven(int n){
    System.out.println(n);
    if(n>1){
        System.out.println("debugx");
        return isEven(n-2);
    }

    if (n == 0) {
        System.out.println("debug1");
        return true;
    }

    else if (n == 1) {
        System.out.println("debug2");
        return false;
    }

    else{
        System.out.println("ERROR");
        return false;
    }
}

La salida ahora debería verse así:

debugStart
10
debugx
8
debugx
6
debugx
4
debugx
2
debugx
0
debug1
debugEnd
10 is even
1
npkllr 10 sep. 2018 a las 09:50