8

重複の可能性:
数式を単純化するための戦略

式を表すツリーを構築する数式パーサーがあります。たとえば、私が入力する2+y+3+yと、これの内部表現は次のようになります。

ここに画像の説明を入力

今、私たち人間はすぐにそれを見ることができます2+y+3+y = 2y + 5. 私が見るコンピューターのトリッキーな部分は、私が左に立っている場合+、他のブランチで右に別の追加があることに気付かないことです-これは評価するときは問題ありませんが、単純化するときは問題ありませんこれがうまくできる方法がわかりません。

クラスの組み合わせは次のとおりです。 ここに画像の説明を入力

これをグーグルで検索しようとしましたが、ここで役立つものは何も見つかりませんでした. いくつかの一般的なウェイポイント、またはURLなどをいただければ幸いです

編集:例では、追加のみが含まれていることに注意してください。パーサーは次のような式をサポートしています: 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 に答える