【发布时间】:2011-05-13 16:15:57
【问题描述】:
我正在考虑一种方法来解决具有简单面向对象的简单方程。我发现了一种似乎在变量单独存在的所有情况下都有效的方法。见:
对于示例,此等式:(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这种方式?也就是说,如何添加两个变量栈?
【问题讨论】:
-
您不需要两个变量堆栈。您需要一个简化阶段,将其更改为
2x = 4,然后求解x。 -
“我正在考虑一种方法来解决具有简单面向对象的简单方程。” - 这里有一些固有的错误。您可以通过算法解决这个问题(并在程序上扩展)。与其关注 OO(无论多么简单),不如关注这里所需的算法步骤。我的意思是,你如何解出这样一个方程?您通常使用哪些步骤?把它们写下来,然后分析它们以找到一种写成算法的方法。
-
正如迈克尔所说,您的堆栈方法缺乏简化方程的能力。您需要一种简化算法,它采用原始方程并创建一个标准化,您可以将其输入到基于堆栈的过程中。但是,由于您的原始算法只能处理自变量仅出现一次的方程,因此存在限制。它无法处理变量出现多次的方程(如 x^2+x)。
-
@Michael 你应该这样回答。