使用递归时Java编译器错误'缺少return语句'

时间:2017-01-11 09:59:26

标签: java recursion compiler-errors return

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

3 个答案:

答案 0 :(得分:2)

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

return 0;

如果此类行为被视为非法,则抛出异常:

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

答案 1 :(得分: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 :(得分: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;
}