使用递归时 Java 编译器错误'missing return statement'



我正在实现一种遍历trie的方法(更具体地说,我正在尝试计算叶节点的数量。进入这些叶节点的边都有一个终止符符号"#")。

我正在使用 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作为参数传递,但在进行了一些研究之后,我发现上面的代码被认为是更好的做法。我只是不知道如何解决这个编译器错误。任何帮助将不胜感激!

可能存在n.getNumEdges()等于0并且for语句不会执行的情况。应返回默认值

return 0;

或者如果此类行为被视为非法,则抛出例外:

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

我在这里有点猜测,但我认为以下是您的意图?

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,而不是执行递归调用。

当你声明你的函数返回任何值(在你的例子中是 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;
}

相关内容

最新更新