所以我正在学习如何通过Java使用递归。我写了一个简单的程序,它将所有数字添加到1和n之间,它看起来就是这样做的。我感到困惑的是print语句,它会打印4次(对于解决方案的每个较小部分的每个结果),如果再次调用该方法并且条件还没有达到打印语句,我感到很困惑满意。我理解这可以通过在main方法中创建一个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;
}
答案 0 :(得分:1)
让我解释为什么会这样。
您的第二个print语句打印除test=> update foo set field1='10000000000000', field2='100000000000000' where id=1;
ERROR: value "10000000000000" is out of range for type integer
LINE 1: update foo set field1='10000000000000', field2='100000000000...
^
= 1时的所有和值。当test=> \set VERBOSITY verbose
test=> update foo set field1=10000000000000, field2=100000000000000 where id=1;
ERROR: 22003: integer out of range
LOCATION: int84, int8.c:1298
test=> update foo set field1='10000000000000', field2='100000000000000' where id=1;
ERROR: 22003: value "10000000000000" is out of range for type integer
LINE 1: update foo set field1='10000000000000', field2='100000000000...
^
LOCATION: pg_atoi, numutils.c:75
= 1时,第一个print语句将打印出值
以这种方式思考:每个非void方法调用都将返回。如果它没有返回,它将继续执行,直到达到return语句。
你说第二个print语句应该只打印最后一个和值。但是你看,该方法只能返回两个位置 - 在n
语句中,或在方法结束时。当n为1时,前一个位置只到达一次,这意味着该方法的另外四次将通过最后的return语句返回。要在最后到达return语句,必须执行第二次打印。这意味着第二个print语句必须执行四次!
使用调试器逐步完成代码。这是最容易理解实际发生的事情。
答案 1 :(得分:1)
我已经绘制了一个序列图,希望这可以解释递归过程。
有一个递归的回顾过程,在调用递归方法之前,下一个命令将被推入调用堆栈。
所以我们可以简单地说System.out.println
将被推送到recursiveCall
之前调用堆栈,然后在recursiveCall
返回之后,主进程将继续使用堆栈上的top命令,即{{1 }}
答案 2 :(得分:0)
这是因为在else下方的第二个打印声明。 在执行时,调用递归函数并且它不会 到达底部的打印声明。但是在n = 1之后,即执行if条件然后它返回函数递归(2-1)并转到down并返回sum(也是print)并将sum的值返回到递归的位置(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;
}
}
答案 3 :(得分:0)
当递归堆栈已满时,它会从尾部开始清空。这就是if语句下面的print语句开始执行的原因。注意:递归过程将返回其调用的值,因此如果条件不满足,则返回到该点,但整个递归过程将继续,直到堆栈清空为止。 无论我说什么都是所谓的尾递归。