有人可以解释一下(VB)

时间:2015-04-24 07:28:20

标签: vb.net recursion

我是编码新手,最近对创建一系列角色的多种排列感到好奇。我的解决方案有很多嵌套的For Next循环很笨重,所以我搜索了其他解决方案并找到了下面的解决方案,但是我无法完全理解它。

    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)= Chars(i)的部分,因为根据我的理解,它使得存储在该索引中的Current(索引)值等于字符中的值,但不知何故在下一行是从Current(index)值创建一个产生正确结果的字符串。

非常感谢帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

好的,我不得不复制你的代码以查看结果,因为我不确定你要做什么,但让我们来解释一下。

对于第一个周期,我们有:

  

csize = 35

     

index = 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

好的,现在我们完成了第一个周期,让我们进入第二个周期:

  

csize = 35

     

index = 0

     

深度= 2

有什么区别?没有,直到我们达到这个代码:

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

在上面的代码中,索引不再与depth - 1相同,所以我们进行递归,并且 - &gt; important&lt; - 而不是传递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)

简而言之:

- &GT;您将计算的字符存储在upto字符串中。

- &GT;每次输入bf_recursion,您都可以恢复已有的字符

- &GT;每次索引大1,所以你改变了NEXT字符

一个重要的注意事项

使用您的应用程序,您可以创建一个非常长的循环,用户无法终止而不会终止进程。你可能想看一下。