我也来凑下热闹
Dim T()
Dim length '要取的元素的总个数
Dim arr(0) '要组合的第一个元素 长度 1
Dim brr() '组合的剩余元素 长度 length-1
Dim tep() '临时数组 存放每次结果
Dim dic As Object '字典,存放最终结果
Dim strjoin ' t()数组元素拼接而成 例如 abcdefg
Sub ee()
Set dic = CreateObject("scripting.dictionary")
length = 4
T = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j")
' T = Array("a", "b", "c", "d", "e", "f")
strjoin = Join(T, "")
' MsgBox InStr(strjoin, "e")
ReDim tep(0 To 0)
For i = 0 To UBound(T) - length + 1
DG1 = 0
arr(0) = T(i)
tep(0) = arr(0)
ReDim brr(0 To length - 2)
For tt = LBound(brr) To UBound(brr)
tt1 = tt1 + 1
brr(tt) = T(tt1)
'Debug.Print brr(tt)
Next
tt1 = tt1 - UBound(brr)
Call DG(tep(), brr())
Next
For Each e In dic
Debug.Print e
Next
Debug.Print "合计组合数:"; dic.Count
End Sub
Sub DG(arr1, brr1) '递归主程序
Dim str, str1 As String, crr()
K1 = -1
For i = 0 To UBound(brr1)
str = brr1(i)
str1 = str1 + str
Next
dic.Add arr1(0) & str1, arr1(0) & str1
Debug.Print arr1(0) & str1
Select Case aa(brr1)
Case Is = 1
Exit Sub
Case Is = 2
ReDim crr(0 To length - 2)
'如果brr1最后第二位和最后1位 未相邻 例 6取 4 110101 1011001
If InStr(strjoin, brr1(UBound(brr1))) - InStr(strjoin, brr1(UBound(brr1) - 1)) > 1 Then
For i = 0 To UBound(brr1) - 2
crr(i) = brr1(i)
Next
crr(UBound(crr()) - 1) = T(InStr(strjoin, brr1(UBound(brr1) - 1)))
crr(UBound(crr())) = T(InStr(strjoin, brr1(UBound(brr1) - 1)) + 1)
'如果brr1最后第二位是brr1 第二位 且 brr1最后2位已到达数组t最后 例 6取 4 110011 101011
ElseIf brr1(UBound(brr1) - 1) = brr1(1) And InStr(strjoin, brr1(UBound(brr1))) - InStr(strjoin, brr1(UBound(brr1) - 1)) = 1 Then
For i = 0 To UBound(crr)
crr(i) = T(InStr(strjoin, brr1(0)) + i)
Next
'如果brr1最后第二位不是brr1 第二位 且 brr1最后2位已到达数组t最后 例 6取5 111011 7取5 1110011 1101011
ElseIf brr1(UBound(brr1) - 1) <> brr1(1) And InStr(strjoin, brr1(UBound(brr1))) - InStr(strjoin, brr1(UBound(brr1) - 1)) = 1 Then
For i = UBound(brr1) To LBound(brr1) Step -1
If InStr(strjoin, brr1(i)) - InStr(strjoin, brr1(i - 1)) > 1 Then
For j = O To i - 2
crr(j) = brr1(j)
Next
For K = i - 1 To UBound(crr)
K1 = K1 + 1
crr(K) = T(InStr(strjoin, brr1(i - 1)) + K1)
Next
Exit For
Else
End If
Next
Else
End If
Call DG(tep(), crr())
Case Is = 3
ReDim crr(0 To length - 2)
For i = 0 To UBound(brr1) - 1
crr(i) = brr1(i)
Next
crr(UBound(crr())) = T(InStr(strjoin, brr1(UBound(brr1))))
Call DG(tep(), crr())
Case Else
End Select
End Sub
Function aa(arr2) '判断 当前元素位置
For i = UBound(T) - length + 2 To UBound(T)
L1 = T(i)
L = L + L1
Next
For i = O To UBound(arr2)
K1 = arr2(i)
K = K + K1
Next
If L = K Then '已组合到最后 6选3 100011 OR 6选4 100111 输出 退出递归
aa = 1
ElseIf T(UBound(T)) = arr2(UBound(arr2)) Then '元素未全部移到最后 6选3 110001 OR 6选4 101101 brr第一位需往后选,剩余位数按顺序选取
aa = 2
ElseIf T(UBound(T) - length + 2) <> arr2(0) And T(UBound(T)) <> arr2(UBound(arr2)) Then '未全部移到最后 6选3 11100 OR 11010 brr前几位不变,最后一位后移一位选取
aa = 3
Else
End If
End Function
