可能重复:
简化数学表达式的策略
我有一个数学表达式解析器,它构建一棵树来表示表达式。例如,如果我输入2+y+3+y
,其内部表示形式将是:
2+y+3+y = 2y + 5
。我认为对于计算机来说棘手的部分是,如果我站在左边的+
上,我不知道在另一个分支中右侧还有一个加法 - 在评估时这并不重要,但在简化时我不知道如何很好地完成这个任务。这是类之间的关系图:
![enter image description here](https://istack.dev59.com/2n2Em.webp)
注意,对于示例,我仅包括了加法。解析器支持像:1+2*(3^4-4/5*(1+2))这样的表达式。
可能重复:
简化数学表达式的策略
我有一个数学表达式解析器,它构建一棵树来表示表达式。例如,如果我输入2+y+3+y
,其内部表示形式将是:
2+y+3+y = 2y + 5
。我认为对于计算机来说棘手的部分是,如果我站在左边的+
上,我不知道在另一个分支中右侧还有一个加法 - 在评估时这并不重要,但在简化时我不知道如何很好地完成这个任务。由于您的类结构可以表达的表达式集合非常有限,因此您可以简单地计算每个变量出现的次数并总和所有常量。
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));