2016-09-24 103 views
2

任何人都可以解釋這個程序的輸出嗎?爲什麼是第二個值7?Java遞歸函數技巧

無法理解遞歸函數調用go(this)

public class ThisIsTricky { 

    int state = 0; 

    public ThisIsTricky(int s) { 
     state = s; 
    } 

    public static void main(String[] args) { 
     ThisIsTricky obj1 = new ThisIsTricky(1); 
     ThisIsTricky obj2 = new ThisIsTricky(2); 

     System.out.println(obj1.go(obj1) + "" + obj2.go(obj2)); 
    } 

    int go(ThisIsTricky thisIsTricky) { 
     if (this.state == 2) { 
      thisIsTricky.state = 5; 

      go(this); 
     } 
     return ++this.state; 
    } 

} 

輸出: -

2 7 

回答

3

要注意的重要一點是,state是一個成員變量,所以它不共享obj1obj2。每個都有自己的價值(分別爲1和2)。

爲什麼obj2的輸出爲7?條件(this.state == 2)對於obj2是正確的,所以你遞歸到go(this)。現在條件不再成立,因爲state已更改爲5,因此state會增加。遞歸調用結束,您現在返回到調用函數(在go(this)之後)和state再次遞增。因此,5 + 1 + 1 = 7。

+1

正確解釋 – Ironluca

1

該程序的輸出將出現爲27(不含空格)。這是由於java在函數調用中傳遞了對象變量的地址。

  1. 第一2將是obj1.go(obj1)呼叫這將是OBJ1的狀態值的增量的結果。
  2. 下輸出將7obj2.go(obj2)被調用,併爲OBJ 2的狀態值是2觸發if聲明並更改狀態值5。然後遞歸函數go(this)與原來的參數相同的地址再次呼籲。這次不調用if語句,函數只是返回一個遞增值,即6。然後控件返回到原始函數,函數返回該值的增量,即7,並將其打印在輸出中。
1

'OBJ1': '!1 = 2' '狀態= 1',因此返回1 + 1 = 2

'OBJ 2' 是容易當你解開這個遞歸理解:

 
State = 2 so we enter the conditional clause: 
Set state=5 
Recursively call to 'go' 
    state is 5 and 5!=2. So skip conditional clause 
    increment state, state is now 5+1=6 
    return 6 
Back in the original call to 'go', increment state, state is now 6+1=7 
return 7 

因此,輸出是27