因此,我正在学习如何通过Java使用递归。我编写了一个简单的程序,它把1到n之间的所有数字相加,看起来就能完成它的工作。让我感到困惑的地方是print语句,它打印4次(针对解决方案的每个较小部分的每个结果),如果再次调用该方法而条件尚未满足,那么它是如何到达print语句的。我理解这可以通过在主方法中创建一个int变量并将返回分配给它来解决。
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;
}发布于 2017-07-30 03:57:34
我画了一个序列图,希望这能解释递归过程。
递归有一个追溯过程,在调用递归方法之前,下一个命令将被推入调用堆栈。因此,我们可以简单地说,System.out.println将在recursiveCall之前被推到调用堆栈,然后在recursiveCall返回之后,主进程将继续使用堆栈上的top命令,即System.out.println。

发布于 2017-07-30 02:35:24
让我解释一下为什么会发生这种情况。
第二个打印语句打印除n =1时以外的所有和值。当n =1时,第一个打印语句将打印出该值。
请这样想:每个非空方法调用都将返回。如果它不返回,它将继续执行,直到到达返回语句为止。
您说第二个print语句应该只打印最后一个sum值。但是,您可以看到,该方法只能返回两个位置--在if (num == 1)语句中,或者在方法的末尾。当n为1时,只到达前一个位置一次,这意味着其他四次方法将通过返回语句在末尾返回。要到达返回语句的末尾,必须执行第二次打印。这意味着第二个print语句必须执行四次!
使用调试器一步一步地完成代码。这是最容易理解的实际情况。
发布于 2017-07-30 02:38:13
这是因为下面的第二个打印语句。在执行时,调用递归函数,它不会到达底部的print语句。但是在n=1 ie执行if条件之后,它返回到函数递归(2-1),然后返回下和和(也是打印),并将sum值返回到调用递归(3-1)的位置,等等。。这就是它打印每个和的地方。
一个代码,只打印最后的和是给below.Print是包括在主打印最后答案,只有我希望这将有所帮助。
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;
}
}https://stackoverflow.com/questions/45395773
复制相似问题