2016-09-24 3 views
2

Könnte jemand die Ausgabe dieses Programms erklären? Warum ist das der zweite Wert 7?Java Rekursive Funktion Trick

Lage nicht rekursiven Funktionsaufruf 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; 
    } 

} 

Output zu verstehen: -

2 7 

Antwort

3

Wichtig zu bemerken ist, dass state ist eine Membervariable, so dass es nicht zwischen geteilt wird obj1 und obj2. Jeder hat seinen eigenen Wert (1 bzw. 2).

Warum ist der Ausgang 7 für obj2? Die Bedingung (this.state == 2) gilt für obj2, also gehen Sie rekursiv in go(this). Jetzt ist die Bedingung nicht mehr wahr, weil state zu 5 geändert wurde, also wird state inkrementiert. Der rekursive Aufruf endet und Sie kehren nun zur aufrufenden Funktion (nach go(this)) zurück und state wird erneut inkrementiert. Daher 5 + 1 + 1 = 7.

+1

korrekte Interpretation – Ironluca

1

Die Ausgabe des Programms würde herauskommen, 27 (ohne Leerzeichen) zu sein. Dies liegt daran, dass Java die Adresse der Objektvariablen in den Funktionsaufrufen übergibt.

  1. Die erste 2 würde das Ergebnis des Aufrufs von obj1.go(obj1) sein, die ein Inkrement in dem Zustandswert von obj1 wären.
  2. Das würde nächste Ausgabe 7 sein, wenn obj2.go(obj2) und als das 2 sein Zustand Wert genannt wird obj2 löst die if Anweisung und ändert den Zustandswert 5 .Dann die rekursive Funktion go(this) wieder mit derselben Adresse des ursprünglichen Parameter aufgerufen wird . Diesmal wird die if-Anweisung nicht aufgerufen, und die Funktion gibt einfach einen inkrementierten Wert zurück, also 6. Das Steuerelement kehrt dann zur ursprünglichen Funktion zurück und die Funktion gibt ein Inkrement auf diesen Wert zurück, das heißt 7, und es wird in der Ausgabe gedruckt.
1

'obj1': '1 = 2' 'state = 1 und zurück so 1 + 1 = 2.

'obj2' ist leichter zu verstehen, wenn Sie die Rekursion entwirren:

 
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 

Somit ist der Ausgang 27