2017-01-11 3 views
-1

トライをトラバースする方法を実装しています(具体的には、リーフノードの数を数えようとしています。 '#')。私は、Javaを使用していますが、この方法を使用するときに、エラーを取得しています再帰を使用するとJavaコンパイラエラー 'missing 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

最初のステップで関数から復帰した場合、ループはどのように反復の2番目のステップに進むのですか? –

+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; 
} 
関連する問題