我是编码新手,最近对创建一系列角色的多种排列感到好奇。我的解决方案有很多嵌套的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)值创建一个产生正确结果的字符串。
非常感谢帮助,谢谢。
答案 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字符
一个重要的注意事项
使用您的应用程序,您可以创建一个非常长的循环,用户无法终止而不会终止进程。你可能想看一下。