2

我在玩这个功能:

public class x {

public static void main(String[] args) {
recurse(10);
}

public static int recurse(int theNumber) {

    if(theNumber == 0) {
        return 0;
    }

    else
    {
        System.out.println(theNumber);
        theNumber--;
        recurse(theNumber);
        System.out.println(theNumber);
    }

    return -1;
}
}

我得到了这个输出:

10 9 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8 9 按任意键继续。. .

这怎么可能?我知道从 10 到 0 的倒计时是从哪里来的……但是它到底是怎么倒计时的?我很确定我错过了关于递归的基本概念。有人可以填空吗??

4

7 回答 7

6

那是因为System.out.println(theNumber);你的方法中的最后一个。在递归调用该方法并完成该方法之后,它正在打印这些值。

于 2013-04-02T07:04:06.387 回答
3

Habib实际上解释得很好。只需确保您了解在参数 theNumber 为零之前遵循递归,因此递归终止,并且这发生在任何最后一次 Sysout 调用完成之前。另请记住,该变量不是共享的,而是每次调用的本地变量。在视觉上,它可能看起来像这样

recurse(5)
print(5)
recurse(4)
  print(4)
  recurse(3)
    print(3)
    recurse(2)
      print(2)
      recurse(1)
         print(1)
         recurse(0)
         print(0)
      print(1)
    print(2)
  print(3)
print(4)  

同一列中的调用属于相同的堆栈帧,即相同的方法调用。请注意,在递归调用之后实际到达第一个打印语句之前,您在调用层次结构中的表现如何。这应该让你清楚。

于 2013-04-02T07:20:11.087 回答
2

为简洁起见,假设您调用recurse(2)了主程序。然后你有:

theNumber= 2 打印 2、递减、调用recurse(1)

--> theNumber= 1,打印 1,递减,调用recurse(0)

----> theNumber= 0,不打印返回

--> theNumber= 1 打印 0(从 1 递减),返回

theNumber= 2 打印 1(从 2 递减),返回

于 2013-04-02T07:13:01.453 回答
1

这就是你需要的——

public static int recurse(int theNumber) {

    System.out.println(theNumber);
    if (theNumber > 0) {
        theNumber--;
        recurse(theNumber);
    }

    return 0;
}
于 2013-04-02T07:12:19.660 回答
0

你的最后一个System.out.println(theNumber)是它的原因。正如您所询问的那样。首先递归调用完成,然后进行回溯。检查此链接回溯

于 2013-04-02T07:11:59.420 回答
0

正如 Habib 所说,流程进入递归,然后在完成执行递归函数后,您的最后一个 System.out.println(theNumber) 被调用。

---->  public static int recurse(int theNumber) {
|   
|       if(theNumber == 0) {
|           return 0;
|       }
|   
|       else
|       {
|           System.out.println(theNumber);
|           theNumber--;
----------< recurse(theNumber);
            System.out.println(theNumber);
        }

        return -1;
    }

因此,函数从递归返回的时间 theNumber 包含仅减 1 的值。

于 2013-04-02T07:12:11.927 回答
0

在最后一个 syso 语句之前,您正在调用递归函数,因此它继续在堆栈上添加您的调用。在达到 0 值后,它通过从堆栈中拉取值返回到当前函数。之后,它通过打印值你最后的 syso 声明...

于 2013-04-02T07:23:37.983 回答