Java 无法理解递归函数的输出。

Java 无法理解递归函数的输出。,java,recursion,void,Java,Recursion,Void,我很难理解这段代码返回时会发生什么。在它输出109 8 7 6 5 4 3 2 1 0之后,为什么它在0之后输出1,而不是再次输出0 public static void a(int b){ if(b<0) return; System.out.println(b); a(b-1); a(b+1); } publicstaticvoida(intb){ 如果(b如果b小于0,方法的执行将停止。返回语句下面的代码将不被执行。如果b小于0,

我很难理解这段代码返回时会发生什么。在它输出109 8 7 6 5 4 3 2 1 0之后,为什么它在0之后输出1,而不是再次输出0

public static void a(int b){
    if(b<0)
       return;

    System.out.println(b);

    a(b-1);
    a(b+1); 
}
publicstaticvoida(intb){

如果(b如果b小于0,方法的执行将停止。返回语句下面的代码将不被执行。

如果b小于0,方法的执行将停止。返回语句下面的代码将不被执行。

您有a(b+1)
这意味着这个案例没有结束条件,这意味着StackOverflow。正如在评论中指出的,它停留在0和1之间这意味着这种情况下没有结束条件,这意味着StackOverflow。正如注释中指出的,它停留在0和1之间

这种情况下的返回只完成当前函数/方法调用,从堆栈中弹出内容并返回到上一个方法调用。换句话说,这只是您的(不完整)基本情况。除非您为
b
增加的情况添加终止条件,否则当前基本情况不足以表示停止所有递归,您将得到一个SO异常。

本例中的返回仅完成当前函数/方法调用,从堆栈中弹出内容并返回到上一个方法调用。换句话说,这只是您的(不完整的)基本情况。除非您为
b
增加的情况添加终止条件,否则当前的基本情况不足以表示停止所有递归,您将得到一个SO异常。

堆栈溢出。调用
a(b+1)
每一次都意味着永远不会有原始函数可以返回的点,或者调用
a(b+1)
,或者调用
a(b+1+1)
等等。

堆栈溢出。每次调用
a(b+1)
都意味着永远不会有原始函数可以返回的点,或者调用
a(b+1)
,或者调用
a(b+1+1)
等等。

虽然此特定示例返回StackOverflower错误,但我不认为这是您要寻找的答案。因此,假设没有导致错误的行,让我演示发生了什么:

public static void a(int b){
if(b<0)
   return;

System.out.println(b);

a(b-1);
a(b+1); //assuming this didn't go to infinity
}
这可能更容易理解为

public static void a(int b){
if(b<0)
    return;
System.out.println(b);
a(b-1);
System.out.println(b + " is done");
}

虽然此特定示例返回StackOverflower错误,但我不认为这是您要寻找的答案。因此,假设导致错误的行不存在,让我演示一下发生了什么:

public static void a(int b){
if(b<0)
   return;

System.out.println(b);

a(b-1);
a(b+1); //assuming this didn't go to infinity
}
这可能更容易理解为

public static void a(int b){
if(b<0)
    return;
System.out.println(b);
a(b-1);
System.out.println(b + " is done");
}

笔和纸在这种情况下总是有用的。笔和纸在这种情况下总是有用的。我很抱歉,因为我是递归新手,所以我有点困惑,但在我发布System.out.println(b)之后;在递归方法之后为什么它仍然被读取,不是在该方法之后所以它不会被访问吗?@user3383134我看到了您编辑的问题。我将更改我的答案,告诉您为什么它在0之后打印1。在第一个return语句之后,为什么具有-1的b的值变为0?@user3383134,因为在您的程序中,当b为-1时,您选中了
 如果(b<0)返回
那么既然-1小于零,它就没有完成方法中的代码,而是返回到上一个方法来完成工作。哦,这段代码呢,在它返回后,为什么仍然增加b的值?公共静态void a(int b){if(我很抱歉,因为我是递归新手,所以我有点困惑,但是在我发布System.out.println(b)之后;在递归方法之后为什么它仍然被读取,不是在该方法之后所以它不会被访问吗?@user3383134我看到了您编辑的问题。我将更改我的答案,告诉您为什么它在0之后打印1。在第一个return语句之后,为什么具有-1的b的值变为0?@user3383134,因为在您的程序中,当b为-1时,您选中了
 如果(b<0)返回
那么既然-1小于零,它就没有完成方法中的代码,而是返回到上一个方法来完成工作。哦,这段代码呢,在它返回后,为什么仍然增加b的值?公共静态void a(int b){if(b虽然这确实会导致StackOverflower错误,但这并不是因为b+1无穷大。它卡在0和1之间的无限递归循环中。虽然这确实会导致StackOverflower错误,但这并不是因为b+1无穷大。它卡在0和1之间的无限递归循环中。