Java 递归方法打印4次
所以我正在学习如何通过Java使用递归。我已经写了一个简单的程序,将1和n之间的所有数字相加,它看起来可以完成它的工作。我感到困惑的是print语句,它打印了4次(对于解决方案中每个较小部分的每个结果),我还不清楚如果再次调用该方法并且条件尚未满足,它是如何到达print语句的。我理解,通过在main方法中创建int变量并将返回赋值给它,可以避免这种情况Java 递归方法打印4次,java,recursion,Java,Recursion,所以我正在学习如何通过Java使用递归。我已经写了一个简单的程序,将1和n之间的所有数字相加,它看起来可以完成它的工作。我感到困惑的是print语句,它打印了4次(对于解决方案中每个较小部分的每个结果),我还不清楚如果再次调用该方法并且条件尚未满足,它是如何到达print语句的。我理解,通过在main方法中创建int变量并将返回赋值给它,可以避免这种情况 public static void main(String[] args) { int sum = recursiveCall(5
public static void main(String[] args) {
int sum = recursiveCall(5);
}
public static int recursiveCall(int num) {
int sum = 0;
if(num == 1) {
sum = 1;
System.out.println(sum);
return sum;
}
else {
sum = recursiveCall(num - 1) + num;
}
// Notice it prints out all results of sum, not just the final value.
System.out.println(sum);
return sum;
}
让我解释一下为什么会发生这种情况 第二条print语句将打印除
n
=1之外的所有总和值。当n
=1时,第一条打印语句将打印出该值
这样考虑:每个非void方法调用都将返回。如果它不返回,它将继续执行,直到到达return语句
您说第二个print语句应该只打印最后一个sum值。但是您可以看到,该方法只能返回两个位置—在if(num==1)
语句中,或者在该方法的末尾。当n为1时,前一个位置只到达一次,这意味着该方法的其他四次将通过末尾的return语句返回。要在末尾到达return语句,必须执行第二次打印。这意味着第二个print语句必须执行四次
使用调试器一步一步地完成代码。这是最容易理解实际发生的事情。让我解释一下为什么会发生这种情况 第二条print语句将打印除
n
=1之外的所有总和值。当n
=1时,第一条打印语句将打印出该值
这样考虑:每个非void方法调用都将返回。如果它不返回,它将继续执行,直到到达return语句
您说第二个print语句应该只打印最后一个sum值。但是您可以看到,该方法只能返回两个位置—在if(num==1)
语句中,或者在该方法的末尾。当n为1时,前一个位置只到达一次,这意味着该方法的其他四次将通过末尾的return语句返回。要在末尾到达return语句,必须执行第二次打印。这意味着第二个print语句必须执行四次
使用调试器一步一步地完成代码。这是最容易理解实际发生的事情。这是因为else下面的第二条print语句。 在执行时调用递归函数,但不调用 到达底部的打印语句。但在n=1之后,即如果条件被执行,那么它将返回到函数recursive(2-1),并返回向下和返回的sum(也是打印),并将sum的值返回到调用recursive(3-1)的位置,依此类推。这就是它打印每个总和的地方 下面给出了一个只打印最终结果的代码。打印包含在主代码中,只打印最终答案 我希望这会有所帮助
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)的位置,依此类推。这就是它打印每个总和的地方 下面给出了一个只打印最终结果的代码。打印包含在主代码中,只打印最终答案 我希望这会有所帮助
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;
}
}
我画了一个序列图,希望这能解释递归过程 递归有一个追溯过程,在调用递归方法之前,下一个命令将被推入调用堆栈。 因此,我们可以简单地说,
System.out.println
将在recursiveCall
之前被推送到调用堆栈,然后在recursiveCall
返回后,主进程将继续执行堆栈上的顶部命令,即System.out.println
我画了一个序列图,希望这能解释递归过程 递归有一个追溯过程,在调用递归方法之前,下一个命令将被推入调用堆栈。 因此,我们可以简单地说,
System.out.println
将在recursiveCall
之前被推送到调用堆栈,然后在recursiveCall
返回后,主进程将继续执行堆栈上的顶部命令,即System.out.println
当递归堆栈已满时,它开始从尾部清空自身。这就是if语句下面的print语句开始执行的原因。注意:递归过程将在调用它的地方返回它的值,所以如果不满足条件,它将返回到该点,但是整个递归过程将继续进行,直到堆栈清空为止。
我所说的就是所谓的尾部递归。当递归堆栈已满时,它开始从尾部清空自己。这就是if语句下面的print语句开始执行的原因。注意:递归过程将在调用它的地方返回它的值,所以如果不满足条件,它将返回到该点,但是整个递归过程将继续进行,直到堆栈清空为止。
我所说的就是所谓的尾部递归。递归打印不能通过在main方法中创建int变量来避免。
recursiveCall()之后立即假设
方法在else块中被调用,它打印和
4次,除了num==1
并从方法返回。递归打印不能是ci