代码之家  ›  专栏  ›  技术社区  ›  SuperJMN

如何通过编程将数学表达式转换为因子和?[关闭]

  •  -5
  • SuperJMN  · 技术社区  · 6 年前

    我正在处理一个棘手的问题 遗留计算系统 .

    它太挑剔了,你不能只告诉它计算 a+b*c . 相反,您需要将其发送为:

    { a }
    { b, c }
    

    具体地说,在c中,计算是这样表示的因子的总和列表:

    var calculationRequest = new List<string[]> 
    { 
        new [] { "a" },
        new [] { "b", "c" },
    };
    
    var result = calculator.Calculate(calculationRequest);
    

    它是如何工作的?

    它的作用是将每一行中的变量相乘,并将所有行相加。

    我遇到的问题是,我想创建一个算法,将表达式转换为遗留系统需要的结构。

    现在,我已经创建了一个解析器,将每个表达式转换为操作树。

    例如 A+B*C 变成

    enter image description here

    但是如何将这棵树转换成遗留系统所需的结构呢?这就是,如何将ast转换成一系列因子的总和?

    我完全被卡住了。

    附加信息

    传统系统可以处理减法和除法,在每个标识符之前添加一个“-”或“/”。

    例如, a-b 会变成

    { a }
    { -b }
    

    a+(b/c) 会变成

    { a }
    { b, /c }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   SuperJMN    6 年前

    我找到了最短的方法 数学.NET符号 Math.NET

    这样做的关键语法如下:

    SymbolicExpression.Parse("a*(b+c)").Expand().Summands().Select(x => x.Factors());
    

    在它中,我展开表达式,然后得到顶点。对于每一个顶点,我都得到了因子。

    为了更好地说明这一点,请考虑以下表达式:

    a * (b + c* -d)
    

    将使用以下代码返回系数总和:

    var expression = "a*(b+c*-d)";
    var sumsOfFactors = SymbolicExpression.Parse(expression)
        .Expand()
        .Summands()
        .Select(x => x.Factors());
    
    var factorsStr = sumsOfFactors.Select(x => string.Join("\t", x));
    var sumOfFactorsStr = string.Join("\n", factorsStr);
    Console.WriteLine(sumOfFactorsStr);
    

    打印因子的总和:

    a   b
    -1  a   c   d
    

    这正是我要找的。