2012-12-18 4 views
1

메서드 호출 자체가 실행될 때가 언제입니까? Java 재귀 : 재귀 메서드 호출 후 명령문이 실행되는시기

private void inorderHelper(TreeNode node) 
{ 
    if (node==null) 
     return; 
    inorderHelper(node.leftNode); 
    System.out.printf("%d", node.data); 
    inorderHelper(node.rigthNode); 
} 

I 볼 수있는 모든 코드가

inorderHelper (node.leftNode)의 라인 노드까지 반복을 계속한다는 것이다 == null이 node.data가 인쇄되기 전에 상기 방법은 바로 종료한다. 나는 내가 재귀 호출을 얻지는 못했지만 재귀 호출 후에 찾을 수있는 모든 예제에는 명령문이 없다고 생각한다. 내가 알고 싶은 것은 System.out.printf ("% d", node.data)와 같은 명령문이 메소드 반환 전에 실행될 때입니다.

+0

내가 보는 것은 컴파일 오류입니다. –

답변

1

이 기능은 왼쪽 절반을 통과 할 때까지 반복적으로 이진 트리 을 통과 한 다음 데이터를 인쇄 한 후 트리의 오른쪽 절반을 통과 할 것입니다.

이것은의 모든 레벨 에서 동일합니다. 즉, 데이터가 인쇄되기 전에 모든 레벨에서 오른쪽 절반이 인쇄 된 트리의 왼쪽 절반이 표시됩니다. 함수가 나타내는대로 처리의이 방식은 "주문 순회에서"라고

, 다른 방법으로는 데이터가 먼저 인쇄 "사전 주문 탐색", 및 "우편 주문 탐색" 있습니다 마지막으로 데이터가 인쇄됩니다. Wikipedia에 대한 자세한 정보가 있습니다.

더 배우려면 디버거를 단계별로 수행하십시오. 비유로

내부 꿈를 완료 할 때까지 각각의 꿈이 일시 정지 가도록 제외 Inception 생각합니다. 또 다른 차이점은 Inception에서 외부 꿈은 내부 꿈의 종료를 제어하는 ​​반면 재귀에서는 외부 호출이 내부 호출이 종료 될 때까지 기다린 후에 계속할 수 있어야한다는 것입니다.

+0

감사합니다. 그러나 내가 가진 질문은 그 것이다. 내 이해에서 실행 흐름을 보면 함수는 왼쪽 절반을 통과하지만 데이터를 인쇄하지는 않습니다. 실제로는 그렇지 않습니다. 그래서 내 질문에 어떻게 왼쪽 절반을 재귀 적으로 통과 할 수있는 문을 함수를 종료 할 경우 데이터 및 오른쪽 절반을 통해 이동하는 문을 인쇄하는 문을 도달하는 함수에 대한이 문제가 발생합니까? –

+0

@RuruMorlano이 함수는 여러 번 호출됩니다. 이것은 재귀의 본질이다.이 호출의 종료는 모든 호출이 종결됨을 암시하지 않으며 다른 호출과 관련이 없다. –

+0

나는 모든 전화가 즉시 종료된다고 생각했습니다. 많이 감사합니다. –

2

방법의 단일 활성화와 관련하여 생각하고있는 것 같습니다. 재귀 호출 상황에서 동일한 메소드가 여러 번 호출 될 수 있습니다. 각 호출에는 자체 스택 프레임이 있습니다. 리턴은 호출 된 활성화로부터 만 리턴됩니다. 그것이 돌아 오면, 다른 메소드에 의해 호출 된 것처럼, 제어는 호출 한 활성화로 다시 전송됩니다.

재귀 호출 후 코드는 각 활성화시 호출 된 정품 인증에서 곧바로 실행됩니다.

+0

대단히 감사합니다. 지금 내가 분명히 생각한 것은 내가 정말로 생각한 것입니다. –

0

이것을 실행하면 좋은 그림을 얻을 수 있습니다.

// first call with depth 0 
private void inorderHelper(TreeNode node, int depth) 
{ 
    ++depth; 
    if (node==null) { 
    System.out.printf("null node at depth %d", depth); 
    return; 
    } 
    System.out.printf("depth %d data %d before left side", depth, node.data); 
    inorderHelper(node.leftNode, depth); 
    System.out.printf("depth %d data %d middle", depth, node.data); 
    inorderHelper(node.rigthNode, depth); 
    System.out.printf("depth %d data %d after right side", depth, node.data); 
}