你会如何编写一个程序来减少等式?

时间:2011-04-08 05:45:33

标签: c++ theory

我可能会错误地解释the question about which I've been thinking上的确切措辞,但我很好奇如何减少多变量的等式。

我假设因子分解起着重要作用,但是我能想到的唯一方法是将方程式分解为操作树并在整个树中搜索重复的节点。我假设有更好的方法,因为许多Web应用程序很快就会这样做。

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

我认为他们正在寻找的那种减少类似于(2 + 3) * x的内容应该变成(* 5 x)而不是(* (+ 2 3) x)。在这种情况下,您可以识别出子树是常量,并计算它们。

您还可以使用关联法和交换法来尝试先移动事物以协助处理过程。因此2 + x + 3将成为(+ 5 x)而不是(+ (+ 2 x) 3)

根据需要采取这个想法。它是以开放式的方式故意给出的。我相信他们会很高兴看到你自动识别出x * x + 2 * x + 1(* (+ 1 x) (+ 1 x))而不是(+ (+ (* x x) (* 2 x)) 1),但你可以在不去那里的情况下做很多好的减少。

答案 1 :(得分:1)

一般的解决方案是编写flex \ bison转换器并减少已解析的表达式。创建翻译流程后,您可以添加expr * expr + 2 * expr + 1 - >等规则。 (* expr expr)就像我在这里写的一样简单。

答案 2 :(得分:0)

你可以使用堆栈来完成。这样简单得多。解决方案发布在这里

  

http://bluefintuna.wordpress.com/2008/07/15/infix-prefix/

答案 3 :(得分:0)

一个问题在于人们认为减少了什么:例如(我写它是为了在中缀中更好的可重复性 - 但前缀类似)x * x + x + 2 + 2 * x,一个明显的减少将是x * x + 3 * x + 2,另一个将是(x + 1)*(x + 2)。由于这是非常重要的问题,并且从作业的措辞中,我会假设你以一些规范的形式(例如多项式,以最高功率排序到最低)(当你有多个变量占用功率之和时)并减少系数(在常数时计算它们))。

请注意,某些优化可能看起来有效,但一般情况下并非如此。例如。不要将(/(* x x)x)减少到x,因为解决方案0突然有效,而不是之前。