我对递归的概念是陌生的,我对递归的理解是,通过递归方法,它将构建堆栈,直到满足基本情况为止。就是说当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 + " ");
}
答案 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-1
。 n--
和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