2016-09-24 2 views
2

누구든지이 프로그램의 출력을 설명 할 수 있습니까? 왜 두 번째 가치가 7입니까? 재귀 함수 호출을 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 인 이유는 무엇입니까? 조건 (this.state == 2)obj2에서 true이므로 재귀 적으로 go(this)으로 이동하십시오. state이 5로 변경 되었기 때문에 이제 조건이 참이 아닙니다. 따라서 state이 증가합니다. 재귀 호출이 종료되고 이제는 호출 함수 (go(this) 이후)로 돌아가고 state이 다시 증가합니다. 따라서, 5 + 1 + 1 = 7

+1

올바른 해석 – Ironluca

1

프로그램 출력은 27 (공백없이)이됩니다. 이것은 자바가 함수 호출에서 객체 변수의 주소를 전달하기 때문입니다.

  1. 2는 OBJ1의 상태 값 증분 될 obj1.go(obj1)의 호출의 결과 일 것이다.
  2. 다음 출력 obj2.go(obj2)가 호출 7이어야하며 가 obj2의 상태 값이 2 인 것으로 if 문 트리거 및 재귀 함수 go(this) 본래 파라미터의 동일한 어드레스로 다시 호출되어 그 때는 5의 상태 값을 변경하는 것 . 이번에는 if 문이 호출되지 않고이 함수는 단순히 증분 값인 6을 반환합니다. 그런 다음 컨트롤은 원래 함수로 돌아가고 함수는 해당 값에 대한 증분 값을 반환합니다. 즉, 7이며 출력에 인쇄됩니다.
1

'으로 obj1': '! 1 = 2' '상태 = 1'등 반환 1 + 1 = 2

'obj2보다'는 재귀 해명하면 이해하기 쉽습니다 :

 
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