Loop per creare cicli annidati

0

C'è un modo per usare un loop per creare loop più nidificati? Per esempio. In questo modo

for (int i = 0; i < iterations; i++)
            {
                //Do stuff
                for (int ii = 0; ii < iterations; ii++)
                {
                    // Do stuff
                    for (int iii = 0; iii < iterations; iii++)
                    {
                        //Do Stuff
                    }
                }
            }

ma consente all'utente di modificare quanti cicli annidati si desidera durante l'esecuzione.

Questo mi consente di conoscere la profondità in cui mi trovo, mentre resetta il contatore "i" a 0, permettendomi di ripetere esattamente la stessa cosa, ma con un valore di profondità diverso.

    
posta Hand of C'thuhlu 28.06.2015 - 09:04
fonte

2 risposte

6

C'è un modo! Puoi risolvere questi problemi con la ricorsione ( link ).

Nel tuo caso sembrerebbe qualcosa di simile a questo (pseudocodice):

function doStuff(int depth) {
    if(depth > USER_DEFINED_DEPTH)
        return;
    //Do stuff
    doStuff(depth + 1);
}

doStuff(0);
    
risposta data 28.06.2015 - 09:28
fonte
1

Hai ottenuto alcune buone risposte qui e su SO alle tue domande, ma ti manca una soluzione non ricorsiva. Ecco come sono andato cercando di risolvere il problema (nota che al momento è leggermente rotto!):

private static IEnumerable<string> GetPaths(int maxDepth, int iterations, string root)
{
    var depths = Enumerable.Range(0, maxDepth);
    var widths = Enumerable.Range(0, iterations);

    var thing = depths.Select(x => Path.Combine(
        depths
            .Reverse()
            .Skip(x + 1)
            .Select(y => y.ToString())
        .Reverse()
        .ToArray()));

    return thing.SelectMany(x => widths.Select(y => Path.Combine(root, x, y.ToString())));
}

Ciò che essenzialmente fa è creare tutti gli insiemi di combinazioni unendo le raccolte e quindi le combina in percorsi. Il risultato è che ogni profondità è coperta, senza alcuna possibilità di far saltare la pila. C'è un bug al momento: la variabile thing (che dovrebbe essere rinominata, dovresti prendere questa rotta) contiene (con un input di 10, 10, "temp" i percorsi:

0
0
0
0
0
0
0
0
0
string.Empty

Lo lascerò a te per capire come risolverlo, ma è molto semplice.

    
risposta data 30.06.2015 - 18:29
fonte

Leggi altre domande sui tag