java - 递归方法如何工作?

标签 java

我在网上找到了这个递归的例子,但是我不明白里面发生了什么。

public class MysteryClass {
    public static void mystery(int n) {
        if (n > 0) {
            mystery(n-1);
            System.out.println(n * 4);
            mystery(n-1);
        }
    }
    public static void main(String[] args) {
        MysteryClass.mystery(2);
    }
}

输出是

4
8
4

我的理解是

  1. 2 大于 0
  2. 2 - 1 = 1
  3. 1 大于 0
  4. 1 - 1 = 0
  5. 0 不大于 0
  6. 现在我们跳到这一行:System.out.println(n * 4);
  7. 1 * 4 = 4
  8. 2 * 4 = 8
  9. 这里我不明白为什么我多了一个“4”的输出

第 9 步发生了什么?

我用了调试器还是不明白。

最佳答案

MysteryClass.mystery(2);
    if (2 > 0) (true) ---> mystery(2-1);
    |   if(1 > 0) (true) ---> mystery (1-1); // Action (A)
    |   |   if(0 > 0) (false) ---> // do nothing 
    |   |     
    |   System.out.println(1 * 4);
    |   mystery(1-1);
    |
    System.out.println(2 * 4);
    mystery(2-1); ---> // repeat action (A)

关于java - 递归方法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001811/

相关文章:

java - 如何在 Windows 中通过命令提示符运行 Junit.Jupiter 代码

java - 使用 PowerMock 模拟私有(private)方法,但仍会调用底层方法

java - 在 Java 中定义新字符 (Android)

java - 如何使用我创建的对象测试 java 中的方法? (欢迎提供有用的标题建议。)

java - MacBook Air 的 Java/J2EE/RoR 开发工作?

java - 来自 JSON 的带有动态 key 的 DTO

java - "generic array creation"修复时提示操作不安全

java - 在 MYSQL 中使用 liquibase 删除外键(如果存在)

java - 取消代理 Hibernate 对象的优雅方式

Java:仅当选择右侧菜单项时才继续迭代数组列表