2014-02-14 103 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的步驟弄錯了,你也應該明白這一點。