我对递归的概念很陌生,我对它的理解是,当它遍历方法时,它会构建堆栈,直到满足基本情况。也就是说,当神秘(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 + " ");
}
3条答案
按热度按时间hujrc8aj1#
你的问题在于
n--
.为什么?
让我们试试
mystery(1)
作为基本解释。你知道为什么吗?
您不能修改
n
希望它能保持不变。尝试将其替换为:
q9rjltbz2#
我的问题是,如果堆栈应该包含神秘(9),为什么9没有被输出,为什么/如何多次输出0?
这是合乎逻辑的
n
接近零。但是,当n =< 0
. 所以让我们跳过所有递归调用直到n==1
.n
大于零,所以得到递减。n == 0
. 下一个电话,n
不大于零,因此递归停止并n
打印出来。最后一个调用从堆栈中退出。记得你减少了吗
n
在打电话之前,就是这样0
我也是。然后所有其他调用都以相同的方式从堆栈中传出:
n--;
mystery(n-1);
mystery(n -1);
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
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
由1n
变成0(2) 做一些递归
在递归中,0不会被再次减去,但它仍然会被打印出来。这是控制台中的第一个0
(3) 打印
n
从(1)打印第二个0