2012-05-21 5 views
5

Il mio problema è stato così:Come codificare per i livelli dinamici del ciclo?

Ho diverse liste che devono essere permutate, ma i numeri delle liste sono inconoscibili. E anche tutti i numeri di elementi in ogni elenco sono inconoscibili. Sicne Vorrei attraversare tutte le combinazioni di elementi della lista, come 1) selezionare A dalla lista 1, A dalla lista 2, A dalla lista 3; 2) A dalla lista 1, A dalla lista 2, dalla lista 3 ... per TUTTA la permutazione.

utilizzare nidificato ciclo for per attraversare, come se ho due liste, quindi:

 for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++) 
     { 
      for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++) 
      { 
       // Do sth 
      } 
     } 

Se ho tre liste, quindi:

 for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++) 
     { 
      for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++) 
      { 
       for (int k = 0; k < list[2].EnergyParameters.ListEnergyLevelCandidates.Count; k++) 
       { 
        // Do sth 
       } 
      } 
     } 

Poiché i numeri della lista sono inconoscibili , quindi i numeri del nido sono inconoscibili, il che significa che non so quanti livelli di ciclo deve essere scritto.

In questo tipo di circostanza, come posso scrivere il codice per i livelli dinamici del ciclo? Non voglio scrivere 10 loop per 10 liste.

risposta

10

Nel caso in cui non si conoscano quanti elenchi ci sono, non si scrivono cicli annidati: invece, si scrive la ricorsione. Ad ogni livello dell'invocazione si esegue un ciclo una sola lista, in questo modo:

void AllCombos(List<string>[] lists, int level, string[] current) { 
    if (level == lists.Length) { 
     // Do somthing; items of current[] contain elements of the combination 
    } else { 
     foreach (var s in lists[level]) { 
      current[level] = s; 
      AllCombos(lists, level+1, current); 
     } 
    } 
} 

chiamata AllCombos come segue:

var lists = new List<string>[10]; 
for (int i = 0 ; i != 10 ; i++) { 
    lists[i] = PopulateMyList(i); 
} 
string[] current = new string[lists.Length]; 
AllCombos(lists, 0, current); 
+0

Questo ancora exexute multi-ciclo? – Asker

+0

@Asker Lo fa. Sebbene i loop non siano nidificati manualmente nell'origine del programma, sono nidificati al momento dell'esecuzione. Guarda come si chiama AllCombos? È qui che avviene la "magia" (anche se non c'è decisamente nulla di magico in proposito). – dasblinkenlight

+0

why & what is 10? È la profondità massima assunta o cosa? –

Problemi correlati