См. Сначала: Постфиксная запись в дереве выражений для преобразования вашего RPN в дерево.
Как только вы получите уравнение left expression = right expression
, измените его на left expression - right expression = 0
и создайте дерево с left expression - right expression
через Маневровый двор и ответ выше. Таким образом, когда вы оцениваете дерево, вы должны получить ответ как 0.
Теперь, основываясь на ваших ограничениях, обратите внимание, что если переменная (скажем, x) неизвестна, результирующее выражение всегда будет иметь вид
(ax + b)/(cx + d)
где a, b, c, d будут зависеть от других переменных.
Теперь вы можете рекурсивно вычислять выражение как кортеж (a, b, c, d).
В конце концов, вы в конечном итоге решите линейное уравнение
(ax + b)/(cx + d) = 0
дача x = -b/a
Таким образом, вам не нужно вычислять отдельные выражения для каждой переменной. Достаточно одного дерева выражений. А с учетом других переменных вы просто рекурсивно вычисляете кортеж (a, b, c, d) и в конце решаете линейное уравнение.
(Неполный) псевдокод будет
TupleOrValue Eval (Tree t) {
if (!t.ContainsVariable) {
blah;
return value;
}
Tuple result;
if (t.Left.ContainsVariable) {
result = Eval(t.Left);
value = Eval(t.Right);
return Compose(t.Operator, result, value);
} else {
result = Eval(t.Right);
value = Eval(t.Left);
return Compose(t.Operator, result, value);
}
}
Tuple Compose(Operator op, Tuple t, Value v) {
switch (op) {
case 'PLUS': return new Tuple(t.a + v*t.c, t.b + v*t.d, t.c, t.d);
// (ax+b)/(cx+d) + v = ( (a + vc)x + b + dv)/(cx + d)
// blah
}
}
Например, если выражение x+y-z = 0
. Дерево будет
+
/ \
x -
/ \
y z
Для y = 5 и z = 2.
Eval (t.Right) вернет y-z = 3, так как это поддерево не содержит x.
Eval (t.Left) вернет (1,0,0,1)
, что соответствует (1x + 0)/(0x + 1)
. Примечание: приведенный выше псевдокод является неполным.
Теперь Compose of (1,0,0,1) со значением 3 даст (1 + 3*0, 0 + 3*1, 0, 1) = (1,3,0,1)
, что соответствует (x + 3)/(0x + 1)
.
Теперь, если вы хотите решить эту проблему, вы берете x равным -b/a = -3/1 = -3
Я оставлю оригинальный ответ:
В общем это будет невозможно.
Например, рассмотрим выражение
x*x*x*x*x + a*x*x*x*x + b*x*x*x + c*x*x + d*x = e
Получение выражения для x
в основном соответствует поиску корней многочлена
x 5 + топор 4 + bx 3 + cx 2 + dx -e
, что в целом оказалось невозможным, если вы хотите использовать +, -, /, * и nth корни. См. Абель Руффини Теорема.
Есть какие-то ограничения, о которых вы забыли упомянуть, которые могут упростить проблему?