Я думал о способе решения простых уравнений с простой ориентацией объекта.Я нашел метод, который работает во всех случаях, когда переменная одна.См .:
Например, это уравнение: (4 / x + 3) / 2 = 2
Сначала я преобразовываю равенство в операторе минус ((4 / x + 3) / 2 - 2 = 0
), чтобы все равнялось нулю.Затем я применяю все операции в обычном порядке приоритета, точно так же, как если бы x
стало числом.Первый - 4 / x
, я кладу в стек операцию: 4/
и возвращаю x.Следующим является x + 3
(помните, что 4 / x
привело к x
).Операция переходит в стек (теперь 4/ +3
) и возвращает x
.Повторяя это, финальный стек будет 4/ +3 /2 -2
.Затем я возвращаю все операции в следующем порядке:
+n --> -n
-n --> +n
*n --> /n
/n --> *n
n/ --> n/
**n --> **(1/n)
(where the missing value of these binary operations is the variable)
Теперь стек равен 4/ -3 *2 +2
.Теперь я изменяю порядок и применяю все операции к нулю:
Стек: +2 *2 -3 4/
Операция: 4 / ((0 + 2) * 2 - 3)
Результат равен четырем, значение x
.
Это очень запутанно и сложно, но логично и легко сделать код в ruby, который выполняет это в любом уравнении:
class Variable
# define all numeric operators to use the stack and return self
end
def solve
x = Variable.new
yield(x)
return x.value
end
x = solve do |x|
(4 / x + 3) / 2 == 2
end
Окончательный интерфейс этого очень крутой.
Но моя проблема в том, как: x + x == 4
решить таким образом?Другими словами, как добавить два переменных стека?