2014-02-14 97 views
1
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; 
    } 
} 

努力了解这里的执行流程。Java递归执行流程

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

+1

调用栈“开卷*,你会看到相同的N如前面堆栈帧(即所谓的刚刚返回的功能),即,每次调用'prod'时,都会有一个* new * n局部变量,其值不受任何其他'prod'调用的影响 – user2864740

+0

奇怪的是,该递归正在计算'n!/(m-1)!' - 那m <= n, if m > n无限递归产生一个StackOverflow :) – DSquare

回答

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 
1

如果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的步骤弄错了,你也应该明白这一点。