2012-06-20 19 views
7

Quiero correr algo como esto:libre durante

For a = 0 To 4 
    For b = a To 4 
     For c = b To 4 
     Console.WriteLine(a & b & c) 
     Next 
    Next 
Next 

pero necesito para crear un n bucles entre sí. Así que creé este método:

'iFrom = 0; iTo = 4; Depth = 3(loop count); 
Private Sub Iterate(ByVal iFrom As Integer, ByVal iTo As Integer, ByVal Depth As Integer) 
    For i = iFrom To iTo 
     If Depth - 1 > 0 Then Iterate(iFrom, iTo, Depth - 1) 

     'Do stuff here 
    Next 
End Sub 

¿Cuál sería la mejor manera de recuperar los valores "i" de niveles superiores? ¿Debería almacenarlos en una matriz? ¿O hay una forma completamente diferente de abordar este problema?

Respuesta

0

Después de jugar con este método, finalmente encontré la solución. Aquí está:

Private Sub Iterate(ByVal iFrom As Integer, ByVal iTo As Integer, ByVal Depth As Integer, ByVal iValues As Integer()) 
    For i = iFrom To iTo 
     iValues(Depth - 1) = i 
     If Depth - 1 > 0 Then 
      Iterate(i, iTo, Depth - 1, iValues) 
     Else     
      'Do stuff, in this case print the current iValues 
      Console.WriteLine(String.Join("", iValues.Select(Function(x) x.ToString).ToArray))     
     End If 
    Next 
    Console.WriteLine() 
End Sub 

'Usage: 
Dim iValueArray(Depth) As Integer 
Iterate(0, 1, 2, iValueArray) 
+0

Debe mover el 'If' fuera del bucle, porque' Profundidad' no cambia de iteración a iteración. Este cambio lo llevaría al diseño estándar de las funciones recursivas que describí en mi respuesta. – dasblinkenlight

0

Puede agregar una matriz o estructura similar como parámetro a Iterate() y para cada llamada a Iterate() agrega el valor actual de i a la matriz.

Por lo tanto, puede conocer la profundidad de su ciclo y el valor actual del ciclo "principal".