Ruby 用逻辑方法解方程的问题
我在想一种用简单的面向对象的方法来解简单的方程。我发现了一种方法,它似乎在变量单独存在的所有情况下都有效。见: 对于样本,该方程:Ruby 用逻辑方法解方程的问题,ruby,math,equation,Ruby,Math,Equation,我在想一种用简单的面向对象的方法来解简单的方程。我发现了一种方法,它似乎在变量单独存在的所有情况下都有效。见: 对于样本,该方程:(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。然后,我按以下顺序还原所有
(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-34/
操作: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
?换句话说,如何添加两个变量堆栈?根据要求,我将回答我之前的评论:
您不需要两个变量堆栈。您需要一个简化阶段,将其更改为
2x=4
,然后求解x
为了扩展这一点,第一步是进行一些符号计算,如术语重写和简化。一旦你有了这些,就使用你当前的解算器(记住路易斯在评论中说的话)。你不需要两个变量堆栈。您需要一个简化阶段,将其更改为
2x=4
,然后求解x
“我正在考虑一种用简单的对象定向来求解简单方程的方法。”-这里有一些固有的错误。您可以通过算法(并在一定程度上通过程序)解决此问题。不要关注OO(无论多么简单),而是关注这里需要的算法步骤。我是说,你怎么解这样的方程?您通常使用哪些步骤?把它们写下来,然后分析它们,寻找一种将它们写成算法的方法。正如Michael所说,你的堆栈方法缺乏简化方程的能力。您需要一个简化算法,该算法接受原始方程并创建一个规范化的方程,您可以将其输入到基于堆栈的流程中。但是,还有一些限制,因为如果自变量只出现一次,那么原始算法只能处理方程。它不能处理变量多次出现的方程(如在x^2+x中)。可能重复@Michael,你应该回答这个问题。