简化代数表达式

Eri*_*kTJ 8 c# math tree algebra

可能重复:
简化数学表达式的策略

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

在此输入图像描述

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

这是课程如何组合在一起: 在此输入图像描述

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

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

dtb*_*dtb 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));
Run Code Online (Sandbox Code Playgroud)

  • @ErikTJ:但你只问了加法。您可能会在计算机科学教科书中找到任意代数表达式的通用解决方案;IMO 这里的要求太多了。 (4认同)