简化代数表达式

时间:2012-05-09 20:23:28

标签: c# math tree algebra

  

可能重复:
  Strategies for simplifying math expressions

我有一个数学表达式解析器,它构建一个树来表示表达式。比方说,我输入2+y+3+y,其内部表示为:

enter image description here

现在,作为人类,我们可以立即看到2+y+3+y = 2y + 5。我看到计算机的棘手部分是,如果我站在左边+,我不知道在另一个分支中我还有另一个权利 - 这无关紧要评估,但简化时,我不知道如何做得很好。

这是课程如何组合在一起: enter image description here

我曾试图谷歌这一点,但没有找到任何可以帮助我的地方。只是一些通用的航点,或者一个网址或者其他什么东西都会受到赞赏

编辑:请注意,对于示例,我只包含了添加内容。解析器支持以下表达式:1 + 2 *(3 ^ 4-4 / 5 *(1 + 2))

1 个答案:

答案 0 :(得分:0)

由于可以用类结构表达的表达式集非常有限,因此您可以简单地计算每个变量出现的频率并总结所有常量。

var nodes = tree.Flatten();

var variables = nodes
    .OfType<Variable>()
    .GroupBy(x => x.Name)
    .Select(g => new Multiplication(
        new Variable(g.Key), new Constant(g.Count())));

var constants = nodes
    .OfType<Constant>()
    .Sum(x => x.Value);

var result = new Addition(
    variables.Aggregate((x, y) => new Addition(x, y)), 
    new Constant(constants));