我试图通过可视化它来理解 Java 中的递归。我浏览了youtube上的一些教程,并使用其中的一个以下示例
public class TestRecursion {
public static void main(String []args) {
new TestRecursion().reduceByOne(10);
}
public void reduceByOne(int n) {
System.out.println("Before "+n);
if(n >= 0) {
reduceByOne(n-1);
System.out.println("Inside "+n);
}
System.out.println("After "+n);
}
}
据我目前所了解,对 reduceByOne() 的每次调用都将被放置在执行堆栈中。就像是
因此,首先 main() 进入堆栈。由于它调用reduceByOne(10),这个方法将进入堆栈,然后调用reduceByOne(9) 并将其压入堆栈,依此类推。 reduceByOne(-1) 入栈后,由于没有更多的方法可以执行,reduceByOne(-1) 将被弹出并执行。
我无法理解弹出方法后会发生什么?让我们说,reduceByOne(2) 从堆栈中弹出。我相信,将要执行的代码看起来像这样
public void reduceByOne(2) {
System.out.println("Before "+2);
if(2 >= 0) {
reduceByOne(2-1);
System.out.println("Inside "+2);
}
System.out.println("After "+2);
}
这不会将 reduceByOne(2-1) 再次放入堆栈吗?还是会被跳过?如果是这样,一旦方法被弹出,运行时如何知道要执行什么以及跳过什么?
可能是我把它复杂化了。但是,我无法清楚地了解递归,因此非常感谢任何帮助。
最佳答案
当方法返回时(在您的情况下,将在 n >= 0
时首先发生),执行将返回到前一个“调用”点,在这种情况下,要执行的下一行将是 System.out.println("Inside "+n);
,然后每个方法将是继续退出并返回到代码中的前一个“调用”点
例如...
绿色是“插入”,橙色是“流行”的结果
显然,在某些时候,您将返回 main
,但这只是一个说明
这与“正常”代码的工作方式没有什么不同,你调用一个方法,当它返回时,它返回到它之前执行的点
这是对流程的过度简化,但我希望它能让您更好地形象化流程
关于java - 如何可视化递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45071697/