所以我定义了一个递归函数,它将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)); }
}
}
然而,编译器抛出一个错误,告诉我我的函数必须返回一个double类型。 if和else语句都直接返回if语句的double和else语句通过同一函数返回的2个double的总和。这是什么交易?如果我在if-else之外放置一个return语句,那么错误会自行解决但是要使用它会要求我通过每次递归保持一致的静态或全局变量。我想知道我的函数有什么问题,因为它感觉比全局变量更直观,我想我在这里错过了一个关于递归的关键概念。感谢任何帮助 - 谢谢!
答案 0 :(得分:5)
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;
的事实而变得更加复杂)其中一个分支。)
相反,您的代码应该像这样构建:
YYYY-MM-DD
这样每个分支都有一个有效的退出条件。