【问题标题】:Algorithm to convert expression tree to polynomial form将表达式树转换为多项式形式的算法
【发布时间】:2015-09-22 20:40:47
【问题描述】:

我尝试使用不同的关键字进行搜索,但没有发现任何有用的信息。我什至不确定“多项式”在这里是否正确,请指教。

我正在尝试找到递归算法(理想情况下在 C# 上)来将我的表达式树转换/扩展为简化的标准(我猜是多项式)形式。例如:

输入:

(X1+X2+X3*X4)*X5+X6

输出:

X1*X5 + X2*X5 + X3*X4*X5 + X6

我有一组源类:

public abstract class Expr
{ 
    public static Op Op(string operatorName, params Expr[] children)
    {
        var res = new Op() { Operator = operatorName };
        res.Children.AddRange(children);
        return res;
    }
    public static Var Var(string valName)
    {
        var res = new Var(){ Name = valName};
        return res;
    }
}
public class Op:Expr
{
    public string Operator { get; set; }
    public List<Expr> Children = new List<Expr>();
}

public class Var:Expr
{
    public string Name { get; set; }
}

我需要实现以下方法:

public static IEnumerable<IEnumerable<Var>> SimplifyToPolynom(Expr expression)
{
    throw new NotImplementedException();
}

//USE CASE:
public static void Test()
{
    //(X1+X2+X3*X4)*X5+X6
    var inputExpression =
        Expr.Op("+",
            Expr.Op("*"
                , Expr.Op("+"
                    , Expr.Var("X1")
                    , Expr.Var("X2")
                    , Expr.Op("*"
                        , Expr.Var("X3")
                        , Expr.Var("X4")
                            )
                          )
                , Expr.Var("X5")
                    )
            , Expr.Var("X6")
        );

    var output = SimplifyToPolynom(inputExpression);
    // Exected result [[X1,X5],[X2,X5], [X3,X4,X5], [X6]]
}

【问题讨论】:

  • 是 + 和 * 唯一可能的运算符吗?
  • 对于我的任务是的,但是如果解决方案可以扩展到更多,那当然会很棒

标签: c# algorithm recursion expression-trees polynomials


【解决方案1】:

穿过树。

当你发现一个包含“+”节点的“*”节点时,用扩展的形式替换那个子树。

您获取“+”节点的子节点列表,并用新的“+”替换“*”节点,其中每个子节点都是原始“*”节点的所有其他子节点和其中之一之间的“*” “+”节点的子节点。

因为每当您展开时,您将“*”节点向下推到树下,它最终会完成,因为您的树是有限的。

您可以扩展算法以获取您想要的任何其他类似扩展。

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2011-01-08
    相关资源
    最近更新 更多