为什么下面的代码段两次不输出9和0?

wn9m85ua  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(285)

我对递归的概念很陌生,我对它的理解是,当它遍历方法时,它会构建堆栈,直到满足基本情况。也就是说,当神秘(9),我认为它会输出

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

而是输出

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

我的问题是,如果堆栈应该包含神秘(9),为什么9没有被输出,为什么/如何多次输出0?当n=0时,条件不是假的吗?

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

hujrc8aj1#

你的问题在于 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
}
q9rjltbz

q9rjltbz2#

我的问题是,如果堆栈应该包含神秘(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 + " ");

因此,当它最终从堆栈中退出并命中print语句时:

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

vojdkbi0

vojdkbi03#

首先, n-- 等于 n=n-1 . 两者的区别 n-- 以及 n-1 前者是否将其值更新回同一引用 n ,后者返回一个新的int。
回到问题的前半部分,为什么不输出9?因为对于任何n>0的if都将(1)减去1,(2)做一些递归,(3)打印它,因此打印的值必须小于输入n乘以1。
为什么要打印2次?让我们解决这个问题,让我们 n be 1:
(1) 减去 n 由1 n 变成0
(2) 做一些递归
在递归中,0不会被再次减去,但它仍然会被打印出来。这是控制台中的第一个0
(3) 打印 n 从(1)
打印第二个0

相关问题