因此,我正在定义一个递归函数,该函数将x的值作为参数(例如算术变量x,即“ x + 3 = 5”)并返回算术表达式的结果。该表达式取自二进制表达式树,如下所示:
java - 递归返回错误,Java-LMLPHP

您从根部开始,一直往下走,直到碰到树叶为止,然后回到山上。树上的表达式为:

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


但是,编译器抛出一个错误,告诉我我的函数必须返回double类型。 if和else语句都直接返回一个double的if语句,而else语句则通过同一函数返回的2 double的总和返回。这是怎么回事?如果我在if-else之外放置return语句,则错误会自行解决,但要解决该问题,将需要我在每次递归中保持静态或全局变量的一致性。我想按原样知道我的函数出了什么问题,因为它感觉比全局变量直观得多,而且我想这里缺少关于递归的关键概念。任何帮助表示赞赏-谢谢!

最佳答案

if和else语句均返回一个double


他们实际上没有。 if分支始终有效,但else分支却无效。如果this.value等于“无效”或列表中未包含的其他内容,会发生什么?这样它就永远不会击中return语句。由于必须始终返回或引发异常,因此不允许这样做。

即使您的程序以逻辑上总是必须返回值的方式构造,编译器也不会在程序的所有分支上进行复杂的分析以确保它总是返回某些值。它只是检查每个分支都有有效的回报。

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

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


因为编译器并不知道它总是必须满足这两个条件之一(这个问题因以下事实而变得更加复杂:根据x是什么,它不一定总是必须退出这些分支之一) )。

相反,您的代码应采用以下结构:

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


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

08-06 01:11
查看更多