递归 return 错误,Java

Recursive return error, Java

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

你从根部开始,一直向下工作,直到碰到叶子,一旦你完成,你就会回来。那么树上的表达式就是:

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

但是编译器抛出一个错误,告诉我我的函数必须 return 类型为 double。 if 和 else 语句 return 直接加倍 if 语句,else 语句通过相同函数对 2 个加倍 return 求和。这是怎么回事?如果我在 if-else 之外放置一个 return 语句,那么错误会自行解决,但要使用它需要我在每次递归中保持静态或全局变量的一致性。我想知道我的函数有什么问题,因为它感觉比全局变量直观得多,而且我认为我在这里遗漏了一个关于递归的关键概念。感谢您的帮助 - 谢谢!

Both the if and the else statements return a double

他们实际上没有。 if 分支始终如此,但 else 分支不如此。如果 this.value 等于 "Invalid" 或其他不在您列表中的值,会发生什么情况?然后它永远不会遇到 return 语句。由于需要始终 return 或抛出异常,因此这是不允许的。

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

因此,例如,类似的内容无效

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

因为编译器不知道它总是必须满足这两个条件之一(这个问题因以下事实而变得更加复杂,具体取决于 x 是什么,它可能并不总是去那些分支之一)。

相反,您的代码结构应如下所示:

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

因此每个分支都有一个有效的退出条件。