为什么以下代码段两次都不会输出9和0?

时间:2018-12-07 03:02:08

标签: java recursion

我对递归的概念是陌生的,我对递归的理解是,通过递归方法,它将构建堆栈,直到满足基本情况为止。就是说当mystery(9)时,我认为它将输出

0,1,2,3,4,5,6,7,8,9 

但输出

0,0,1,2,3,4,5,6,7,8. 

我的问题是,如果堆栈应该包含mystery(9),为什么不输出9?为什么/如何输出0不止一次?当n = 0时条件是否为假?

public static void mystery(int n) {
    if (n > 0) {
        n--;
        mystery(n);
    }
    System.out.print(n + " ");
}

3 个答案:

答案 0 :(得分:3)

  

我的问题是,如果堆栈应该包含mystery(9),为什么不输出9?为什么/如何输出0不止一次?

逻辑上可以看到n接近零。但是,当n =< 0时,递归停止。因此,让我们跳过所有递归调用,直到n==1

n大于零,因此它会减少。 n == 0。下一个调用n不大于零,因此递归停止,并且打印出n

0

然后最后一个调用离开堆栈。请记住,在通话之前您将n递减了,所以也是0

0 0

然后所有其他调用都以相同的方式离开堆栈:

0 0 1 2 3 4 5 6 7 8

9不会被打印,因为您需要在递归调用之前从n中减去。


两者之间的区别:

n--;

mystery(n-1);

是您将n递减到函数 之前。在

mystery(n -1);

mystery的当前调用进入堆栈n时,它仍然是传入时的状态。或者在9的示例中:

if (n > 0) {
    //n is not changed here. It is still 9
    mystery(n -1); //Passes 8 to mystery
}
System.out.print(n + " ");

因此,当它最终脱离堆栈并击中打印语句时:

System.out.print(n + " ");
//n is still 9, so it will print 9

答案 1 :(得分:0)

您的问题出在n--

为什么?

让我们尝试mystery(1)作为基本解释。

mystery(1) {
    if (1 > 0) {
        1--;
        mystery(0);
    }
    System.out.print(0 + " ");
}

您现在看到为什么


不能修改 n ,希望它保持不变。

尝试将其替换为:

public static void mystery(int n) {
    if (n > 0) {
        mystery(n - 1); //minusByOne and pass it to the next call
    }
    System.out.print(n + " "); // n itself stays the same
}

答案 2 :(得分:0)

首先,n--等于n=n-1n--n-1之间的区别是前者将其值更新回相同的引用n,后者返回一个新的整数。

回到问题的前半部分,为什么不输出9? 因为对于任何n> 0,如果将(1)减去1,(2)进行一些递归,(3)打印它,则打印值必须比输入n小1。

为什么0打印2次? 让我们打破问题,让n为1:

(1)将n减去1
n变为0

(2)进行一些递归
递归中的0将不再被减去,但仍将被打印。这是控制台中的前0个

(3)从(1)打印n
打印第二个0