1

私は多くの解決策を試しましたが、どれも正しい答えを与えてくれません。

他のいくつかの変数に依存する変数があり、それらはオペランドと呼ばれます。それぞれがそのオペランドのリストを含むそのような変数のリストがあります。新しい変数の式を作成するたびに、次のような循環依存関係があるかどうかを確認したい

A (またはそのオペランドのいずれか)-> B (またはそのオペランドのいずれか)-> C (またはそのオペランドのいずれか)-> D(またはそのオペランドのいずれか)-> A

これまでのところ、私はこれを思いついた

foreach (var newVar in newlyCreatedVars)
            {
                newVar.Rank = 0;
                List<string> tags = newVar.Operands.ToList();
                List<string> temp;
                while (tags.Count > 0)
                {   
                    var dependentVars= newlyCreatedVars.Where(t => tags.Contains(t.Name)).ToList();
                    temp = new List<string>();
                    tags.Clear();
                    temp.AddRange(dependentVars.SelectMany(t => t.Operands).ToArray());
                    if (temp.Count > 0)
                    {
                        newVar.Rank++;
                        tags = temp;
                    }
                    var dep = newlyCreatedVars.Where(t=> newVar .Operands.Contains(t.Name)).ToList();
                    if(dep.Exists(t=> t.Rank > newVar .Rank))
                       return false;
                }
            }

助けてください。

ありがとう :)

4

1 に答える 1

4

変数を、各変数からそのオペランドへのエッジを持つ有向グラフのノードと考えると、これはかなり標準的な問題です。このグラフでサイクルを見つけたいとします。

次に、このSOの質問が役立つはずです:有向グラフでサイクルを検出するための最良のアルゴリズム

于 2012-08-01T07:53:29.770 に答える