【问题标题】:Java Recursion Flow of executionJava 递归执行流程
【发布时间】:2014-03-14 06:15:00
【问题描述】:
public static void main(String[] args) {
    System.out.println(prod(1, 4));
}

public static int prod(int m, int n) {
    if (m == n) {
        return n;
    } else {
        System.out.println(n);
        int recurse = prod(m, n - 1);
        System.out.println(recurse);
        int result = n * recurse;
        return result;
    }
}

在这里努力理解执行流程。

在 if 子句中,当 m =n 时,在 1=1 的情况下,它返回 n =1,但从这里直接声明 int 递归,然后相同的 n 变为 2。我不明白发生了什么.

【问题讨论】:

  • 调用堆栈“展开*”,您会看到与前一个堆栈帧(调用刚刚返回的函数)相同的 n。也就是说,每次调用 prod 时都有一个 new n 局部变量,其值不受任何其他 prod 调用的影响。
  • 奇怪的是,递归正在计算 n! / (m-1)! - 鉴于 m n 无限递归会产生 StackOverflow :)

标签: java recursion execution flow


【解决方案1】:

您的程序将递归调用prod() 函数并将局部变量存储在堆栈中直到m!=n。一旦 m 等于 n,它将开始执行存储在堆栈中的程序的剩余部分。

为了更好地理解,我在您的程序中添加了System.out.println() 语句。

public static void main(String[] args) {
    System.out.println("Final Output in Main "+prod(1, 4));
}

public static int prod(int m, int n) {
    if (m == n) {
        System.out.println("Return Result: "+n);
            return n;
    } else {
        System.out.println("Print : "+n);
            int recurse = prod(m, n - 1);
        System.out.println("Print Recurse: "+recurse);
            int result = n * recurse;
        System.out.println("Return Result: "+result);
            return result;
    }
}

程序流程是这样的

Print : 4
Print : 3
Print : 2
Return Result: 1
Print Recurse: 1
Return Result: 2
Print Recurse: 2
Return Result: 6
Print Recurse: 6
Return Result: 24
Final Output in Main 24

【讨论】:

    【解决方案2】:

    如果m 是 1 而n 是 4,这就是它的作用:

    1. 打印 4
    2. 致电prod(1, n -1)
    3. 打印 3
    4. 致电prod(1, n -1)
    5. 打印 2
    6. 致电prod(1, n -1)
    7. 打印 2
    8. 打印 4
    9. 返回 4
    10. 打印 4
    11. 打印 12 等等

    我认为我做对了。当它返回时,它会展开堆栈。即使我弄错了 #10 和 #11 步骤,您也应该了解大致的情况。

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2019-05-26
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      相关资源
      最近更新 更多