我无法理解返回时这段代码会发生什么。输出10 9 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);
}
答案 0 :(得分:3)
你有a(b+1)
这意味着这种情况没有结束条件,这意味着StackOverflow。正如评论中指出的那样,它停留在0和1之间
答案 1 :(得分:1)
如果b小于0,则停止执行该方法。返回声明下方的代码将不会被执行。
答案 2 :(得分:0)
这种情况下的返回只是完成当前的函数/方法调用,从堆栈中弹出并返回到前一个方法调用。换句话说,那只是你的(不完整的)基本情况。除非您为b
增加的情况添加终止条件,否则当前基本情况将不足以说停止所有递归并且您将获得SO异常。
答案 3 :(得分:0)
堆栈溢出。每次调用a(b+1)
表示原始函数无法返回,或者调用a(b+1)
或调用a(b+1+1)
等等。
答案 4 :(得分:0)
虽然这个特定示例返回StackOverflowError,但我认为这不是您正在寻找的答案。因此假装错误导致的行不在那里让我展示正在发生的事情:
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
}
该方法的运行方式与读取方式完全相同,但您可以创建子任务。
检查if语句,然后打印b的值。然后它运行a(b-1)然后运行a(b + 1)。
你得到了奇怪的结果,因为then it runs a(b-1)
实际上是一系列任务本身。这个方法完成了我之前提到过的所有事情,它们都会在第一个实例到达(b + 1)之前发生。
让我们说你打电话给a(1);
1 is not less than 0
print 1
a(1-1) //which is zero a(0)
//begin sub-task a(0)
0 is not less than 0
print 0
a(0-1) // which is -1
//begin sub-task a(-1)
-1 is less than 0 so return
a(0+1)
1 is not less than zero
print 1
a(1-1) // which is zero
zero is not less than zero
print zero
a(0-1)
etc. etc.
可能更容易将其视为
public static void a(int b){
if(b<0)
return;
System.out.println(b);
a(b-1);
System.out.println(b + " is done");
}
以下a(1);
执行以下操作:
if(1 < 0) // false
print 1
begin a(1-1) or a(0)
if(0 < 0) // false
print 0
begin a(0-1) or a(-1)
if(-1 < 0) //true so return IE go back to the calling method
print "0 is done"
print "1 is done"