我试图通过可视化它来理解 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() 的每次调用都将被放置在执行堆栈中。就像是

java - 如何可视化递归-LMLPHP

因此,首先 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); ,然后每个方法将是继续退出并返回到代码中的前一个“调用”点

例如...

java - 如何可视化递归-LMLPHP

绿色是“插入”,橙色是“流行”的结果

显然,在某些时候,您将返回 main ,但这只是一个说明

这与“正常”代码的工作方式没有什么不同,你调用一个方法,当它返回时,它返回到它之前执行的点

这是对流程的过度简化,但我希望它能让您更好地形象化流程

关于java - 如何可视化递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45071697/

10-12 21:22