8

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

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

在此处输入图像描述

现在,作为人类,我们可以立即看到这一点2+y+3+y = 2y + 5。我看到的计算机的棘手部分是,如果我站在左边+,我不知道我在另一个分支的右边还有另一个添加 - 这在评估时并不重要,但在简化 i 时看不出这怎么能做得很好。

这就是类如何组合在一起的方式: 在此处输入图像描述

我试图用谷歌搜索这个,但在这里找不到任何可以帮助我的东西。只是一些一般的航点,或一个网址或其他东西,将不胜感激

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

4

1 回答 1

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));
于 2012-05-09T20:34:20.900 回答