2016-08-11 4 views
1
public void length() { 
    System.out.println(length(head, 0)); 
} 
public int length(Node he, int count) { 
    if(he!=null) { 
     // System.out.println(he.data +" "+count++); 
     // count++; 
     // return length(he.next, count); 
     return length(he.next, count++); 
    } 
    return count; 
} 

위의 코드에서 링크 된 목록의 길이를 찾아야합니다. 동일한 코드를 실행하면 길이가 0입니다.하지만 주석이 달린 코드를 사용하면 올바른 길이를 얻게됩니다. 왜 그런 일이 일어나는거야?재귀를 기반으로 자바를 사용하여

+1

'카운트 ++'실제로 통과'count', [편집하십시오 이 질문을 참조하십시오 게시물 증분 작동 방법] (http://stackoverflow.com/questions/2371118/how-do-the-post-increment-i--pre-increment-i-operators-work-in-java) – SomeJavaGuy

+0

두 번째 매개 변수를 제거하고 단순히' return (he == null)? 0 : 1 + 길이 (he.next); '? – fabian

+0

감사합니다. @fabian .. 나는 실제로 당신을 통해 다른 길을 찾았습니다. :) –

답변

5

length(he.next, count++)은 게시 증가 연산자를 사용하므로 count의 원래 값을 메서드 호출에 전달합니다. 따라서 항상 0을 전달합니다.

length(he.next, ++count) 여기에서 증가 된 값인 count이 전달됩니다.

주석이 달린 코드에서 count++ 값을 메서드 호출에 전달하지 않고 이미 증가 된 후 count을 전달하면 작동합니다.

+0

하지만 코드가 재귀되고 다음 재귀 단계를 위해 .. 바로 증가해야합니까? 와트가 반복되는 단계에서 발생하는 것처럼? 왜 재귀에서 그렇게되지 않았습니까? –

+0

@Krishnakrish 나는 당신이 무슨 뜻인지 모르겠다. 당신은 각각의 재귀 호출에'count'의 un-incremented 값을 넘겨주고 있습니다. 재귀가 끝나는 유일한 이유는 (StackOverflowError를 생성하는 대신) 중지 조건이 전달 된'Node' (각 재귀 호출이 진행됨)와 전달 된'count' (항상 0)가 아니라는 것입니다. – Eran

+0

@Eran은 이전 호출 스택이 완료된 후에 값이 증가 할 것으로 예상하는 것처럼 보이지만 그렇지 않습니다. 재귀 메서드에 인수로 전달 된 변수는 해당 특정 재귀 호출 스택 – JavaHopper

0

사용

return length(he.next, ++count);

또는

System.out.println(he.data +" "+count); 
count++; 
return length(he.next, count); 

난 당신과 내 코드를 시뮬레이션하려고합니다

.

귀하의 코드 :

//count = 0 

length(he.next, count++) // length(he.next, 0) 

//after recursion call count increments , count = 1 

내 코드 :

//count = 0 

// before recursion call, ++count increments count 

// count = 1 

length(he.next, ++count) // length(he.next, 1) 

녀석 메신저 새로운 여기에 잘못된 메신저, 나를 :)

+0

의 일부이지만 코드는 반복되고 다음 재귀 단계에 대해 올바르게 증가해야합니까? 와트가 반복되는 단계에서 발생하는 것처럼? 왜 재귀에서 그렇게되지 않았습니까? –

+0

예. 증분해야합니다. 실제로는 카운트가 증가하지만 재귀 호출 후에는 증가가 발생합니다. 그 때문에 당신은 0이라는 오래된 count 값을 전달하고 있습니다. – burakozgul