2015-04-24 3 views
1

Я новичок в кодировании и недавно интересовался созданием нескольких перестановок для выбора символов. В моем решении было много вложенных For Next циклов, которые были неуклюжими, поэтому я искал другие решения и нашел один ниже, однако я не могу его полностью понять.Может ли кто-нибудь объяснить это (VB)

Dim chars() As Char = "1234567890abcdefghijklmnopqrstuvwxyz".ToCharArray 
Dim csize As Integer = chars.Length - 1 
Dim upto As String 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    upto = "             " 

    Dim max_length As Integer = 25 

    For i = 1 To max_length 
     bf_recursion(0, i) 
     Update() 
    Next 

End Sub 

Private Sub bf_recursion(ByVal index As Integer, ByVal depth As Integer) 
    Dim current() As Char = upto.ToCharArray() 

    For i = 0 To csize 
     current(index) = chars(i) 
     upto = CStr(current) 

     TextBox1.Text = (CStr(current)) 
     TextBox1.Refresh() 
     Me.Refresh() 
     '\\lblOutput.Text = CStr(current) 

     If index <> (depth - 1) Then 
      bf_recursion(index + 1, depth) 
     End If 
    Next 
End Sub 

Я не понимаю, раздела, в котором ток (индекс) = Символы (я), так как от моего понимания, что делает значение тока (индекс), хранящееся в этом индексе, равном значение символов, однако какой-то образом в следующей строке создается строка из значения Current (index), которое дает правильный результат.

Справка была бы принята с благодарностью, спасибо.

ответ

2

Хорошо, мне пришлось скопировать код, чтобы увидеть результат, поскольку я не был уверен, что вы пытались сделать, но давайте объясним.

Для первого цикла мы имеем:

CSIZE = 35

индекс = 0

глубина = 1

Петля достаточно легко: вы ходите цикл от 0 до 35 (35 включительно)

 For i = 0 To csize 

В Индексе 0 из context, хранить символ в позиции i

 current(index) = chars(i) 

Так что, когда цикл, это даст такой результат:

current(0) = "1" 'i = 1 
current(0) = "2" 'i = 2 
... 
current(0) = "a" 'i = 11 
current(0) = "b" 'i = 12 

функция CStr изменяет массив current в строку путем размещения всех элементов один за другим:

 upto = CStr(current) 
     Label1.Text = (CStr(current)) 
     Label1.Refresh() 
     Me.Refresh() 

Затем наступает рекурсивную часть, но для первого цикла, нам не нужно это ...

 If index <> (depth - 1) Then 
      bf_recursion(index + 1, depth) 
     End If 
    Next 

Хорошо, теперь мы закончили первый цикл, давайте идти 2-ым:

CSIZE = 35

индекс = 0

глубина = 2

В чем разница? Ничего, пока мы не достигнем этого кода:

 If index <> (depth - 1) Then 
      bf_recursion(index + 1, depth) 
     End If 

В приведенном выше коде, индекс не то же самое, как depth - 1 больше, поэтому мы идем рекурсивной, и -> Важный < - вместо прохождения index = 0, проходим index + 1! Какая разница?

На этот раз, мы не храним наш характер в current(0) но current(1):

current(index) = chars(i) 

, который дает:

current(1) = "1" 'i = 1 
current(1) = "2" 'i = 2 
... 
current(1) = "a" 'i = 11 
current(1) = "b" 'i = 12 

Но, как линии, прежде чем мы сделали это:

Dim current() As Char = upto.ToCharArray() 

current(0) уже заполнено! Потому что upto содержит первый символ. Именно эта линия для:

upto = CStr(current) 

Вкратце:

-> Вы сохраняете символы, вычисленные в upto строке.

-> Каждый раз, когда вы входите bf_recursion, вы восстанавливаете символы, которые вы уже

-> индекс 1 больше каждый раз, так что вы измените следующий символ

Одно важное замечание

С вашим приложением вы создаете очень длинный цикл, который пользователь не может завершить, не убивая процесс. Вы можете посмотреть на это.

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