递归方法打印4次

所以我正在学习如何通过Java使用递归。 我写了一个简单的程序,它将所有数字添加到1和n之间,它看起来就是这样做的。 我感到困惑的是print语句,它打印4次(对于解决方案的每个较小部分的每个结果),如果再次调用该方法并且条件尚未满足,我很困惑它是如何到达print语句的。 我理解这可以通过在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; } 

我画了一个序列图,希望这可以解释递归过程。

有一个递归的回顾过程,下一个命令将在调用递归方法之前被推入调用堆栈。 所以我们可以简单地说System.out.println将在recursiveCall之前被推送到调用堆栈,然后在recursiveCall返回之后,主进程将继续使用堆栈上的top命令,即System.out.println

递归过程

让我解释一下为什么会这样。

第二个print语句打印除n = 1时的所有和值。当n = 1时,第一个print语句将打印出该值

以这种方式思考:每个非void方法调用都将返回。 如果它没有返回,它将继续执行,直到达到return语句。

你说第二个print语句应该只打印最后一个和值。 但是你看,方法只能返回两个地方 – 在if (num == 1)语句中,或者在方法结束时。 当n为1时,前一个位置只到达一次,这意味着该方法的另外四次将通过最后的return语句返回。 要在结束时到达return语句,必须执行第二次打印。 这意味着第二个print语句必须执行四次!

使用调试器逐步执行代码。 这是最容易理解实际发生的事情。

当递归是堆栈已满时,它开始从尾部清空自己。 这就是if语句下面的print语句开始执行的原因。 注意:递归过程将在其调用的地方返回其值,因此如果条件不满足,则返回到该点,但整个递归过程将继续,直到堆栈被清空。 无论我说什么都是所谓的尾递归。

这是因为其他下面的第二个印刷声明。 在执行时,调用递归函数,它不会到达底部的print语句。 但是在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; } }