public class add {
public static void main(String[] args) {
int sum = recursiveCall(5);
System.out.println(sum); // this will print 15
}
public static int recursiveCall(int num) {
int sum = 0;
if(num == 1) {
sum = 1;
//System.out.println(sum); this will print 1
return sum;
}
else {
sum = recursiveCall(num - 1) + num;
}
// System.out.println(sum); //this is the reason for each sum.
return sum;
}
}
这是因为else下面的第二个print语句。 在执行时调用递归函数,但不调用 到达底部的打印语句。但在n=1之后,即如果条件被执行,那么它将返回到函数recursive(2-1),并返回向下和返回的sum(也是打印),并将sum的值返回到调用recursive(3-1)的位置,依此类推。这就是它打印每个总和的地方
下面给出了只打印最终和的代码。打印包含在主选项中,仅打印最终答案 我希望这会有所帮助
我画了一个序列图,希望这能解释递归过程
递归有一个追溯过程,在调用递归方法之前,下一个命令将被推入调用堆栈。 因此,我们可以简单地说
System.out.println
将被推到recursiveCall
之前调用堆栈,然后在recursiveCall
返回后,主进程将继续使用堆栈上的顶部命令,即System.out.println
当递归堆栈满时,它开始从尾部清空自己。这就是if语句下面的print语句开始执行的原因。注意:递归过程将在调用它的地方返回它的值,所以如果不满足条件,它将返回到该点,但是整个递归过程将继续进行,直到堆栈清空为止。 我说的就是所谓的尾部递归
让我解释一下为什么会发生这种情况
第二个print语句将打印除
n
=1之外的所有和值。当n
=1时,第一个print语句将打印出该值这样考虑:每个非void方法调用都将返回。如果它不返回,它将继续执行,直到到达return语句
您说第二个print语句应该只打印最后一个sum值。但是您可以看到,该方法只能返回两个位置—在
if (num == 1)
语句中,或者在该方法的末尾。当n为1时,前一个位置只到达一次,这意味着该方法的其他四次将通过末尾的return语句返回。要在末尾到达return语句,必须执行第二次打印。这意味着第二个print语句必须执行四次使用调试器一步一步地完成代码。这是最容易理解实际发生的事情
相关问题 更多 >
编程相关推荐