2017-01-11 40 views
-1

我正在實現一個遍歷一個trie的方法(更具體地說,我試圖計算葉節點的數量,進入這些葉節點的邊都有一個終結符符號'#')。當使用遞歸時Java編譯器錯誤'丟失返回語句'

我使用Java和使用這種方法時,我得到一個錯誤:

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

在循環之外添加一個默認返回語句 –

+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()等於0for語句不執行的情況。你應該返回默認值

return 0; 

,或者如果這樣的行爲被認爲是非法拋出一個異常:

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

構造trie的方式(數據存儲在邊緣而不是節點)確保如果節點沒有子節點,則進入該節點的邊必須是終結符(#),因此理論上不應該發生對? –

+0

既然目的是總結,我建議默認值應該是「0」,但是還有其他的編程問題。 – pdem

+0

@StefaniaDamato,編譯器不夠聰明,無法理解您的業務/算法邏輯。它只是考慮所有可能的方式,不管任何條件 – Andrew

0

當你宣佈你的函數返回的任何值(在你的情況INT),它必須返回任何整數由代碼結束。在你的方法中,函數可能不會返回節點爲空或空的任何東西。

要糾正錯誤,請執行以下更改代碼

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; 
}