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

时间:2014-03-05 10:52:52

标签: java recursion void

我无法理解返回时这段代码会发生什么。输出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); 
}

5 个答案:

答案 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"