2017-01-11 1 views
-1

trie를 트래버스하는 방법을 구현하고 있습니다. (더 구체적으로 말하자면, 리프 노드 수를 계산하려고합니다.이 리프 노드로가는 가장자리에는 모두 터미네이터 기호 '#').재귀를 사용할 때 Java 컴파일러 오류 'return return statement'가 누락되었습니다.

내가 자바를 사용하고 있는데이 방법을 사용할 때 오류가 점점 오전 :

public int traverse(Node n){ 

     for(int i=0; i<n.getNumEdges(); i++){ 
      if(n.getEdgeChar(i) == '#'){ 
       return 1; 
      } 
      else{ 
       return traverse((n.getEdge(i)).getNode()); 
      } 
     } 
} 

나는이 오류를 받고 있어요 왜 이해한다, 그러나 나는 주위 어떻게받을 수 있나요? 처음에는 매개 변수로 noLeaves을 전달하는 것이 가장 좋다고 생각했지만 일부 조사를 한 후에 위의 코드가 더 나은 방법이라고 생각했습니다. 난이 컴파일러 오류를 해결하는 방법을 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다!

+0

외부 루프에서도 기본 return 문을 추가하십시오. –

+5

첫 번째 단계에서 함수에서 돌아 오면 루프는 두 번째 단계로 이동해야합니까? –

+0

@PavneetSingh 이렇게하면 더 나아질 수는 없지만 컴파일은되지만 여전히 작동하지 않습니다. –

답변

1

내가 여기에 조금 추측하고있다,하지만 난 다음 당신이 의도 생각을 다음과 같이 변경?

public int traverse(Node n){ 
    int numOfLeaves = 0; 
    for (int i=0; i<n.getNumEdges(); i++) { 
     if(n.getEdgeChar(i) == '#') { // leaf 
      numOfLeaves += 1; 
     } 
     else { 
      numOfLeaves += traverse((n.getEdge(i)).getNode()); 
     } 
    } 
    return numOfLeaves; 
} 

이렇게하면 모든 가장자리에 대한 순환 호출 결과를 더하고 합계를 반환합니다. #은 리프를 나타내는 것으로 가정되며 재귀 호출을 수행하는 대신 합계에서 1로 계산됩니다.

2

n.getNumEdges()0과 같고 for 문이 실행되지 않는 경우가 있습니다. 당신은 기본값

return 0; 

을 반환하거나 이러한 행위가 불법으로 간주되는 경우 예외가 발생한다 :

throw new IllegalArgumentException("There are no edges in the node!"); 
+0

트라이가 구축되는 방식 (노드가 아닌 에지에 데이터가 저장 됨) 노드에 자식이없는 경우 해당 노드로가는 가장자리는 종결 자 (#) 여야하므로 이론적으로는 발생하지 않아야합니다 권리? –

+0

목적은 합계이므로 기본값은 "0"이어야하지만 다른 프로그래밍 문제가 있음을 제안합니다. – pdem

+0

@StefaniaDamato, 컴파일러는 비즈니스/알고리즘 논리를 이해할만큼 충분히 똑똑하지 않습니다. 어떤 조건과 관계없이 가능한 모든 방법을 고려합니다. – Andrew

0

당신이 (당신의 경우 INT에서) 어떤 값을 반환하는 함수를 선언, 그것은 하나를 반환해야합니다 정수의 끝으로 코드. 당신의 방법에서는, 함수가 노드가 비어 있거나 널 (NULL)이 아닌 것을 리턴하지 않을 수도 있습니다.

오류를 해결하려면, 어떻게 코드

public int traverse(Node n){ 
    int returnValue=-1; 
    for(int i=0; i<n.getNumEdges(); i++){ 
     if(n.getEdgeChar(i) == '#'){ 
     returnValue=1; 
     break;     
     /*return 1;*/ 
     } 
     else{ 
      returnValue=traverse((n.getEdge(i)).getNode()); 
      break; 
      /*return */ 
     } 
    } 
    return returnValue; 
} 
관련 문제