2014-06-24 2 views
2

tree가 binaryTree의 인스턴스 인 경우 카운터 값을 업데이트해야하는 다음 의사 코드가 있습니다. 트리에 더 많은 자식이있는 경우이 메서드를 재귀 적으로 호출합니다. & 카운터를 증가시킵니다.재귀 중 변수 값 보존

문제 I (나는 싶지 않은) 대향 고정 할 경우, 카운터 값이 미세하지만 (아래에 언급 된 바와 같이) I이 방법에 대한 입력으로서 변수를 통과 할 때 I 단지 가치를 1 여기서 뭐가 잘못 됐니?

//Pseudo code 
public static int test(tree) { 
    Integer count = 0; 
    return testTreeRecCounts(tree, count); 
} 

private static Integer testTreeRecursiveCounts(tree, Integer count) { 
    if (tree instanceof binaryTree) { 
     count++; 
     for (Node node :tree.getChild())) { 
      testTreeRecursiveCounts((tree)node, count); 
     } 
    } 
    return count; 
} 
+2

당신은뿐만 아니라 for' 루프'에서'testTreeRecursiveCounts' 메소드 호출의 결과를 추가해야 적절한 결과를 얻을 수 있습니다. – Antoniossss

답변

5

문제는 Integer불변입니다, 그래서 당신이 count++ 할 순간은 count 다른 객체를 가리 킵니다.

프로세스는 다음과 같습니다. 카운트 -> 언 박싱 -> 자동 복싱 (새 오브젝트를 생성)으로 값을 증가시킵니다.

그래서 값이 1 인 첫 번째 객체 만 반환됩니다.

원시 int 대신 Integer을 사용하면 자동 차단/연속 해제를 수행해야하므로 성능이 저하됩니다.

이 문제

이 같은 일을 해결할 수 있습니다 :

private static int testTreeRecursiveCounts(tree) { 
    int count =0; 
    if (tree instanceof binaryTree) { 
     count++; 
     for (Node node :tree.getChild())) { 
      count += testTreeRecursiveCounts((tree)node); 
     } 
    } 
    return count; 
} 
+0

재귀 호출이 수행 될 때마다이 수가 0으로 초기화되지 않습니까? – AFH

+0

@AhmedFahad 우리는 모든 자식에 대한 카운트를 계속 추가하기 때문에 (for 루프 내부를 살펴 본다.) 결과는 모든 자식들에 1을 더한 합계가 될 것이므로이 결과는 다시 부모에게 전달되어 부모가 올바르게 업데이트 될 수있다. 이것은 콜백 추적입니다 :) –