|
用递归组合嵌套递归排列(置换算法)后的可计算任意组合的代码:- Dim sj, sj2, jg, l%, m%, n%, k&
- Sub 递归排列组合()
- tms = Timer
-
- m = [a1].End(4).Row: sj = [a1].Resize(m)
- l = Len(sj(1, 1))
- For i = 2 To n
- If Len(sj(i, 1)) > l Then l = Len(sj(i, 1))
- Next
- ' l = l + 1
- For i = 1 To n
- sj(i, 1) = String(l - Len(sj(i, 1)), " ") & sj(i, 1)
- Next
-
- n = [b1]: [b3] = WorksheetFunction.Combin(m, n):
- ACP = WorksheetFunction.Permut(m, n): [b4] = ACP
- ReDim jg(ACP, 0)
-
- k = 0: Call plzhdg("", 0, 0)
-
- [d:d] = "": [d1].Resize(ACP) = jg
- End Sub
- Sub plzhdg(s$, i%, t%)
- Dim j%
- For j = i + 1 To m
- If t + 1 < n Then
- Call plzhdg(s & "," & sj(j, 1), j, t + 1)
- Else
- sj2 = Split(s & "," & sj(j, 1), ",")
- Call pldg2("", 0, 1)
- End If
- Next
- End Sub
- Sub pldg2(s$, i%, t%)
- If t > n Then jg(k, 0) = s: k = k + 1
- If t <= n Then Call pldg2(s & sj2(t), t, t + 1)
- If i > 1 Then
- If i > 2 Then t1 = Mid(s, 1, (i - 2) * l) Else t1 = ""
- t2 = Mid(s, (i - 1) * l + 1, l)
- t3 = Mid(s, (i - 2) * l + 1, l)
- t4 = Mid(s, i * l + 1)
- s = t1 & t2 & t3 & t4
- Call pldg2(s, i - 1, t)
- End If
- End Sub
复制代码 |
|