【问题标题】:Java compiler error 'missing return statement' when using recursion使用递归时 Java 编译器错误“缺少返回语句”
【发布时间】:2017-05-26 01:24:21
【问题描述】:

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

【问题讨论】:

  • 在循环外也添加一个默认的返回语句
  • 如果你从第一步的函数返回,你的循环应该如何进入迭代的第二步?
  • @PavneetSingh 这不会让它变得更好......正在编译但仍然无法正常工作。
  • for() {...} 循环之外添加一个return -1;
  • 它不会计算叶子,你只有一个递归终止,它总是返回“1”。我认为您忘记了在循环中求和。

标签: java recursion compiler-errors return


【解决方案1】:

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

return 0;

如果这种行为被认为是非法的,则抛出异常:

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

【讨论】:

  • trie 的构造方式(数据存储在边而不是节点中)确保如果节点没有子节点,则进入该节点的边必须是终止符 (#),所以理论上这不应该发生,对吧?
  • 由于目的是求和,我建议默认值应该是“0”,但是还有其他编程问题。
  • @StefaniaDamato,编译器不够聪明,无法理解您的业务/算法逻辑。它只是考虑所有可能的方式,而不考虑任何条件
  • 如果您可以使用异常来捕获潜在的编程问题,请务必这样做。当您不希望代码达到这一点时,throws 语句是无害的。在极不可能的情况下,您有一天会到达那里,您会希望被告知 - 例外情况会确保您会,
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    当您声明您的函数返回任何值(在您的情况下为 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 2014-08-20
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2013-03-10
      • 1970-01-01
      相关资源
      最近更新 更多