Java return做奇怪的事情

时间:2018-09-10 09:19:51

标签: java methods return

我刚刚通过一些练习就开始为大学学习Java。我不是编程新手,只是Java。 我遵循了所有说明,但是Java的return函数确实做了一些很奇怪的事情。 我插入了一些调试输出以更好地理解代码。程序的CMD.output包括在内。

我认为该函数将在返回后立即终止。 但是为什么在这种情况下不这样做?

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;
        }
    }
}

输出(cmd):

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

程序通常需要在此处停止。但是它继续....

ERROR
ERROR
ERROR
ERROR
ERROR
debugEnd
10 is uneven

4 个答案:

答案 0 :(得分:9)

您也应该return进行递归调用,

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

由于尚未返回,因此递归调用到达else条语句,因此返回false

答案 1 :(得分:5)

那是因为您在方法内部具有递归

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

工作方式

  
      
  1. 10> 1,进去10-2 = 8
  2.   
  3. 8> 1,进去,8-2 = 6
  4.   
  5. 6> 1,进去6-2 = 4
  6.   
  7. 4> 1,进去,然后4-2 = 2
  8.   
  9. 2> 1,走进去2-2 = 0
  10.   
  11. 2> 1,否,然后n === 0,是-> System.out.println("debug1");
  12.   

您需要在return中添加一个isEven(n-2)

答案 2 :(得分:1)

更正的代码

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;
    }
}

}

添加了return语句。

答案 3 :(得分:1)

我很确定您只是忘记在return之前添加isEven(n-2)语句。

所以isEven()方法的更正代码如下:

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;
    }
}

现在输出应如下所示:

debugStart
10
debugx
8
debugx
6
debugx
4
debugx
2
debugx
0
debug1
debugEnd
10 is even