回溯实现数字的排列组合

从1--m中选n个数字的排列组合的简单实现,速度还可以:


Sub getall(ByVal m As Byte, ByVal n As Byte, Optional types As Byte = 0)'types=0为排列 types=1 为组合
Dim num As Long, i As Integer, k As Integer, a(), s() As String
ReDim a(1 To n)
k = 1
Do
a(k) = a(k) + 1
If a(k) > m Then
k = k - 1
Else
For i = 1 To k - 1
If a(k) = a(i) Then Exit For
Next
If i = k Then
If k = n Then
num = num + 1
ReDim Preserve s(1 To num)
s(num) = Join(a, ",")
End If
If k < n Then k = k + 1: a(k) = a(k - 1) * types

End If
End If
Loop Until k = 0
Debug.Print Join(s, vbTab)
End Sub

Sub getit()
getall 8, 3, 1 '组合
Debug.Print
getall 8, 3 '排列
End Sub

 

返回:

1,2,3   1,2,4   1,2,5   1,2,6   1,2,7   1,2,8   1,3,4   1,3,5   1,3,6   1,3,7   1,3,8   1,4,5   1,4,6   1,4,7   1,4,8   1,5,6   1,5,7   1,5,8   1,6,7   1,6,8   1,7,8   2,3,4   2,3,5   2,3,6   2,3,7   2,3,8   2,4,5   2,4,6   2,4,7   2,4,8   2,5,6   2,5,7   2,5,8   2,6,7   2,6,8   2,7,8   3,4,5   3,4,6   3,4,7   3,4,8   3,5,6   3,5,7   3,5,8   3,6,7   3,6,8   3,7,8   4,5,6   4,5,7   4,5,8   4,6,7   4,6,8   4,7,8   5,6,7   5,6,8   5,7,8   6,7,8

1,2,3   1,2,4   1,2,5   1,2,6   1,2,7   1,2,8   1,3,2   1,3,4   1,3,5   1,3,6   1,3,7   1,3,8   1,4,2   1,4,3   1,4,5   1,4,6   1,4,7   1,4,8   1,5,2   1,5,3   1,5,4   1,5,6   1,5,7   1,5,8   1,6,2   1,6,3   1,6,4   1,6,5   1,6,7   1,6,8   1,7,2   1,7,3   1,7,4   1,7,5   1,7,6   1,7,8   1,8,2   1,8,3   1,8,4   1,8,5   1,8,6   1,8,7   2,1,3   2,1,4   2,1,5   2,1,6   2,1,7   2,1,8   2,3,1   2,3,4   2,3,5   2,3,6   2,3,7   2,3,8   2,4,1   2,4,3   2,4,5   2,4,6   2,4,7   2,4,8   2,5,1   2,5,3   2,5,4   2,5,6   2,5,7   2,5,8   2,6,1   2,6,3   2,6,4   2,6,5   2,6,7   2,6,8   2,7,1   2,7,3   2,7,4   2,7,5   2,7,6   2,7,8   2,8,1   2,8,3   2,8,4   2,8,5   2,8,6   2,8,7   3,1,2   3,1,4   3,1,5   3,1,6   3,1,7   3,1,8   3,2,1   3,2,4   3,2,5   3,2,6   3,2,7   3,2,8   3,4,1   3,4,2   3,4,5   3,4,6   3,4,7   3,4,8   3,5,1   3,5,2   3,5,4   3,5,6   3,5,7   3,5,8   3,6,1   3,6,2   3,6,4   3,6,5   3,6,7   3,6,8   3,7,1   3,7,2   3,7,4   3,7,5   3,7,6   3,7,8   3,8,1   3,8,2   3,8,4   3,8,5   3,8,6   3,8,7   4,1,2   4,1,3 
4,1,5   4,1,6   4,1,7   4,1,8   4,2,1   4,2,3   4,2,5   4,2,6   4,2,7   4,2,8   4,3,1   4,3,2   4,3,5   4,3,6   4,3,7   4,3,8   4,5,1   4,5,2   4,5,3   4,5,6   4,5,7   4,5,8   4,6,1   4,6,2   4,6,3   4,6,5   4,6,7   4,6,8   4,7,1   4,7,2   4,7,3   4,7,5   4,7,6   4,7,8   4,8,1   4,8,2   4,8,3   4,8,5   4,8,6   4,8,7   5,1,2   5,1,3   5,1,4   5,1,6   5,1,7   5,1,8   5,2,1   5,2,3   5,2,4   5,2,6   5,2,7   5,2,8   5,3,1   5,3,2   5,3,4   5,3,6   5,3,7   5,3,8   5,4,1   5,4,2   5,4,3   5,4,6   5,4,7   5,4,8   5,6,1   5,6,2   5,6,3   5,6,4   5,6,7   5,6,8   5,7,1   5,7,2   5,7,3   5,7,4   5,7,6   5,7,8   5,8,1   5,8,2   5,8,3   5,8,4   5,8,6   5,8,7   6,1,2   6,1,3   6,1,4   6,1,5   6,1,7   6,1,8   6,2,1   6,2,3   6,2,4   6,2,5   6,2,7   6,2,8   6,3,1   6,3,2   6,3,4   6,3,5   6,3,7   6,3,8   6,4,1   6,4,2   6,4,3   6,4,5   6,4,7   6,4,8   6,5,1   6,5,2   6,5,3   6,5,4   6,5,7   6,5,8   6,7,1   6,7,2   6,7,3   6,7,4   6,7,5   6,7,8   6,8,1   6,8,2   6,8,3   6,8,4   6,8,5   6,8,7   7,1,2   7,1,3   7,1,4   7,1,5 
7,1,6   7,1,8   7,2,1   7,2,3   7,2,4   7,2,5   7,2,6   7,2,8   7,3,1   7,3,2   7,3,4   7,3,5   7,3,6   7,3,8   7,4,1   7,4,2   7,4,3   7,4,5   7,4,6   7,4,8   7,5,1   7,5,2   7,5,3   7,5,4   7,5,6   7,5,8   7,6,1   7,6,2   7,6,3   7,6,4   7,6,5   7,6,8   7,8,1   7,8,2   7,8,3   7,8,4   7,8,5   7,8,6   8,1,2   8,1,3   8,1,4   8,1,5   8,1,6   8,1,7   8,2,1   8,2,3   8,2,4   8,2,5   8,2,6   8,2,7   8,3,1   8,3,2   8,3,4   8,3,5   8,3,6   8,3,7   8,4,1   8,4,2   8,4,3   8,4,5   8,4,6   8,4,7   8,5,1   8,5,2   8,5,3   8,5,4   8,5,6   8,5,7   8,6,1   8,6,2   8,6,3   8,6,4   8,6,5   8,6,7   8,7,1   8,7,2   8,7,3   8,7,4   8,7,5   8,7,6

你可能感兴趣的:(数字)