2

タイトルが示すように、ループのネストを非再帰的にループする方法はありますか? つまり、私がこれをやりたかったとしましょう:

while (condition)
{
    while (condition)
    {
         while (condition)
         {
             .... //<- more whiles
         }
     }
}

100 個のネストされた while ループを使用します。ハードコーディングせず、再帰を使用せずにこれを行う方法はありますか?

編集: 明確にするために、100 はデモンストレーションを目的としたものです。

4

5 に答える 5

0

他に何も起こっていないので:

while ({conditionA} && {conditionB} && {conditionC})
{
   /// ...
}

あなたが100を持っているなら、私はあなたがおそらく非常に間違ったことをしているのではないかと思います。これについては、もっと多くの文脈がなければコメントできません。

于 2012-08-16T10:31:45.363 に答える
0

100 whileループの有効なユースケースがあるかどうかはわかりませんが、ここで説明します。

私が考えることができるのは、while条件を組み合わせることだけです。何かのようなもの:

while(x == 1)
{
    while(y == 2)
    {
    }
}

なる可能性があります:

while(x == 1 && y == 2)
{
}

あなたの状態が長くなり始めたら、私はおそらくそれを別の方法に抽出するでしょう。

while(ShouldLoop(x, y))
{
}

private bool ShouldLoop(int x, int y)
{
    return x == 1 && y == 2;
}

もちろん、これは、ネストされていないループで作業を行っていない場合にのみ機能します。

于 2012-08-16T10:31:55.803 に答える
0

no recursionと具体的に言ったことは知っていますが、階層を下る途中でさまざまな関数/メソッドを呼び出せるようにしたいためだと思います。

同じ関数を再帰的に呼び出すことができ、その関数がデリゲートを使用して他のさまざまな関数を呼び出すことができるとしたらどうでしょうか? 呼び出すデリゲート関数のリストと、条件 (ループを続行するかどうか) のデリゲートの別のリストを渡すことは可能でしょうか?

私はこれに数分しか費やしていませんが、これは抽象的なアイデア/思考実験のようなものであり、具体的な解決策ではありません。これが可能かどうかさえわかりませんが、これは基本的な概念を示すはずです:

public delegate void CallableFunctionDelegate();
public delegate bool CallableCondition();

public void CallDelegatesRecursively(
                        List<CallableFunctionDelegate> methodsToCall, 
                        List<CallableCondition> conditionsToCall){

    var currentDelegate = delegatesToCall[0];

    while(conditionsToCall()){

        currentDelegate();  // Call current function

        // (Verify that the list is not empty, etc...)

        var restOfList = methodsToCall.GetRange(1, methodsToCall.length);
        var restOfConditions = 
                   conditionsToCall.GetRange(1, conditionsToCall.length);

        // Call next function in the "hierarchy" / list:
        CallDelegatesRecursively(restOfList, restOfConditions);
    }
}

これで (理論的には! ;)) その関数を呼び出して関数のリストを渡すことができるはずです。それぞれの関数は、対応する条件が true と評価さFれる限り、while ループで呼び出されます。Cを呼び出すたびにF、いくつかの「サブ関数」F2(リスト内の次の関数) も呼び出されます (ただしC2、再帰呼び出しで対応する条件が true と評価された場合のみ...)。

于 2012-08-16T12:07:27.227 に答える
0

BitArrayクラスの使用を検討しましたか? たとえば、条件マスクとして使用できるもの...

于 2012-08-16T10:55:21.147 に答える
0

100 個のネストされたループがある場合、アルゴリズムに問題がある可能性があると思います。

少なくとも、メソッドを再帰的にしようとすることができます。このようなもの(実際に何をしようとしているのかによって大きく変わる可能性があります):

private void RecursiveWhile(int nestedLevel)
{
    // some logic
    if (nestedLevel == 0)
    {
        // some logic
    }
    else
    {     
        // some logic, maybe a while
        RecursiveWhile(nestedLevel - 1);
        // some logic, maybe breaking out of the while
    }
}

RecursiveWhile(100)たとえば、100 レベルの while を使用します。

しかし、一歩下がってアルゴリズムと、なぜ 100 レベルの反復が必要なのかを考えてみることを強くお勧めします。

于 2012-08-16T11:06:42.650 に答える