2012-06-20 3 views
7

Я хочу, чтобы запустить что-то вроде этого:Неограниченный Для петель

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

Но мне нужно, чтобы создать п петель один друг друга. Поэтому я создал этот метод:

'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 

Что было бы лучшим способом получить значения «i» с более высоких уровней? Должен ли я хранить их в массиве? Или есть совершенно другой способ подойти к этой проблеме?

ответ

0

После игры с этим методом я наконец нашел решение. Вот он:

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

Вы должны переместить 'If' вне цикла, потому что' Depth' не изменяется с итерации на итерацию. Это изменение приведет вас к стандартной компоновке рекурсивных функций, которые я описал в своем ответе. – dasblinkenlight

0

Вы можете добавить массив или аналогичную структуру как параметр в Iterate(), и для каждого вызова Iterate() вы добавите текущее значение i в массив.

Таким образом, вы можете узнать глубину своего цикла и текущее значение «родительского» цикла.

Смежные вопросы