Public Sub sort(str1 As String, str2 As String, i As Integer, n As Integer)
Dim i1 As Integer
Dim str As String
Dim s As String
str = str2
For i1 = 1 To i
str = str & Mid(str1, i1, 1)
If Len(str) = n Then
List1.AddItem str
Exit Sub
End If
s = Left(str1, i1 - 1)
s = s & Right(str1, Len(str1) - i1)
sort s, str, i - 1, n
str = Left(str, Len(str) - 1)
Next i1
End Sub
Private Sub Command1_Click()
BeginCalc Val(Text1.Text)
End Sub
Public Sub BeginCalc(n As Integer)
Dim sRet As String
Dim i As Integer
List1.Clear
'初始化为第一级,空串,总共N级
BeginSub 1, "", n
'用来显示最后的组合数目
Text2.Text = List1.ListCount
End Sub
'递归核心
'nLevel 递归层次
'Last 上一层递归的结果
'n为总的递归层次,即N个字符
Public Function BeginSub(nLevel As Integer, Last As String, n As Integer) As String
Dim i As Integer
Dim sRet As String
For i = 1 To n
sRet = Last
'判断是否已经存在当前字符,如果存在,则放弃递归,即不会出现112,223,333之类的重复组合
If InStr(sRet, Trim(Str(i))) = 0 Then
sRet = sRet & Trim(Str(i))
'如果递归到最后一层
If nLevel = n Then
'只有递归了N次的字符串才是正解
If Len(sRet) = n Then
List1.AddItem sRet
End If
Else
'加一个层次继续递归
BeginSub nLevel + 1, sRet, n
End If
End If
Next i
End Function
' 如果给出如彩票方式的组合,则BeginSub的参数多加一个m 如n=36 m = 7
Public Function BeginSub(nLevel As Integer, Last As String, n As Integer, m As Integer) As String
Dim i As Integer
Dim sRet As String
Dim nStart As Integer
If Last = "" Then
nStart = 1
Else
nStart = Val(Right(Last, 1)) + 1
End If
For i = nStart To n
sRet = Last
If InStr(sRet, Trim(Str(i))) = 0 Then
sRet = sRet & Trim(Str(i))
If nLevel = m Then
If Len(sRet) = m Then
List1.AddItem sRet
End If
Else
BeginSub nLevel + 1, sRet, n, m
End If
End If
Next i
End Function