Итак, я определяю рекурсивную функцию, которая принимает в качестве аргумента значение x (например, арифметическую переменную x, то есть «x + 3 = 5») и возвращает результат арифметического выражения. Выражение берется из двоичного дерева выражений, которое выглядит следующим образом:
Вы начинаете с корня и продолжаете двигаться вниз, пока не наткнетесь на листья, и как только вы это сделаете, вы вернетесь обратно. Тогда выражение на дереве будет таким:
х * ((х + 2) + соз(х-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 напрямую, а оператор else — через сумму двух двойных значений, возвращаемых одной и той же функцией. В чем здесь дело? Если я помещу оператор return за пределы if-else, то ошибка устранится сама собой, но для работы с этим мне потребуется поддерживать согласованность статической или глобальной переменной в каждой рекурсии. Я хотел бы знать, что не так с моей функцией как есть, потому что она кажется гораздо более интуитивной, чем глобальная переменная, и я думаю, что здесь отсутствует ключевая концепция рекурсии. Любая помощь приветствуется - спасибо!
ifs
, поэтому просто попробуйте вернуть -1 в конце - person 3kings   schedule 04.11.2015