【问题标题】:Recursive return error, Java递归返回错误,Java
【发布时间】:2016-02-05 11:48:10
【问题描述】:

所以我定义了一个递归函数,它将 x 的值(如算术变量 x,即“x + 3 = 5”)作为参数并返回算术表达式的结果。该表达式取自如下所示的二进制表达式树:

你从根开始,一直往下走,直到碰到树叶,一旦你回来了。那么树上的表达式是:

x * ( (x + 2) + cos(x-4) )。

我的这个函数的代码如下:

     // Returns the value of the expression rooted at a given node
// when x has a certain value
double evaluate(double x) {
    if (this.isLeaf()) {
        //convert every instance of 'x' to the specified value
        if (this.value.equals("x")) {
            this.value = Double.toString(x);
        }
        //return the string-converted-to-double

        return Double.parseDouble(this.value);
    }
    //if-else statements to work as the arithmetic operations from the tree. Checks the given node and performs the required operation
    else {
        if(this.value.equals("sin")) { return Math.sin(evaluate(Double.parseDouble(this.leftChild.value))); }
        if(this.value.equals("cos")) { return Math.cos(evaluate(Double.parseDouble(this.leftChild.value))); }
        if(this.value.equals("exp")) { return Math.pow(evaluate(Double.parseDouble(this.leftChild.value)), evaluate(Double.parseDouble(this.rightChild.value))); }
        if(this.value.equals("*")) { return evaluate(Double.parseDouble(this.leftChild.value)) * evaluate(Double.parseDouble(this.rightChild.value)); }
        if(this.value.equals("/")) { return evaluate(Double.parseDouble(this.leftChild.value)) / evaluate(Double.parseDouble(this.rightChild.value)); }
        if(this.value.equals("+")) { return evaluate(Double.parseDouble(this.leftChild.value)) + evaluate(Double.parseDouble(this.rightChild.value)); }
        if(this.value.equals("-")) { return evaluate(Double.parseDouble(this.leftChild.value)) - evaluate(Double.parseDouble(this.rightChild.value)); }
    }
}                  

但是编译器抛出一个错误,告诉我我的函数必须返回一个双精度类型。 if 和 else 语句都直接返回一个 double - if 语句和 else 语句通过同一函数返回的 2 个 double 的总和。这里有什么交易?如果我在 if-else 之外放置一个 return 语句,则错误会自行解决,但要解决这个问题,我需要在每次递归中保持静态或全局变量的一致性。我想知道我的函数有什么问题,因为它感觉比全局变量更直观,而且我认为我在这里遗漏了一个关于递归的关键概念。感谢您提供任何帮助-谢谢!

【问题讨论】:

  • 你需要最后一个 return 语句,以防万一没有满足那些 ifs 所以试着在最后返回一个 -1

标签: java recursion return binary-tree return-type


【解决方案1】:

if 和 else 语句都返回一个 double

他们实际上没有。 if 分支总是如此,但 else 分支却没有。如果this.value 等于“无效”或其他不在您列表中的内容会怎样?然后它永远不会命中返回语句。因为它要求总是返回,或者抛出异常,所以这是不允许的。

即使您的程序结构在逻辑上总是必须返回一个值,编译器也不会对程序的所有分支进行复杂的分析以确保它总是返回一些东西。它只是检查每个分支是否有有效的返回。

因此,例如,类似的东西是无效的

if(x < 0)  return -1;
if(x >= 0) return 1;

因为编译器不知道它总是必须满足这两个条件之一(这个问题更加复杂,因为根据x 是什么,它可能并不总是必须下降一个那些分支)。

相反,您的代码应该是这样的结构:

if(x < 0) return -1;
else      return 1;

这样每个分支都有一个有效的退出条件。

【讨论】:

  • 啊,好吧,所以我需要在末尾包含一个“else”子句,以确保始终返回某种形式的双精度,是吗?我还想到整个块比 switch 语句更干净,所以包括一个返回“错误”值的默认情况会双重解决我的问题吗?还是我还需要为每个算术运算添加一些异常检查子句?
  • @DavidTamrazov 如果您将switchdefault 一起使用,那就可以了。您也可以始终在函数末尾放置 return 以返回默认值(或者如果认为它不应该达到该点,则可能抛出异常)。要记住的重要一点是,每个分支(即使你“知道”它永远不会发生)都必须有 returnthrow
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2018-01-04
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2012-09-19
相关资源
最近更新 更多