|
本帖最后由 香川群子 于 2012-12-24 11:47 编辑
最后这个,是从m个元素中任意取数n个时,排列组合结果的递归代码:
用了组合递归过程中嵌套进行【两两置换】排列递归的算法。- Sub 排列組合()
- tms = Timer
-
- m = [a1].End(4).Row: sj = [a1].Resize(m) '获取原始数据读入数组sj
- l = Len(sj(1, 1))
- For i = 2 To m
- If Len(sj(i, 1)) > l Then l = Len(sj(i, 1))
- Next
- ' l = l + 1
- For i = 1 To m
- sj(i, 1) = String(l - Len(sj(i, 1)), " ") & sj(i, 1)
- Next
- '以上为统一原始数据字符串长度
-
- n = [b1] '\获取抽取个数n
- AP = WorksheetFunction.Permut(m, n):
- [b3] = WorksheetFunction.Combin(m, n) & "x" & WorksheetFunction.Permut(n, n) & "=" & AP
- ReDim jg(AP, 0) '定义储存结果的数组jg
-
- k = 0: cnt = 0: tms = Timer
- Call plzhdg("", 0, 0) '调用排列组合递归过程
-
- [b9] = Format(Timer - tms, "0.000s ") & cnt & "/" & k
- If k < 65536 Then tms = Timer: [g:g] = "": [g1].Resize(k) = jg: [b10] = Timer - tms
- '输出结果
- End Sub
- Sub plzhdg(s$, i%, t%)
- '排列组合递归过程,但实际上核心部分是组合递归过程。
- Dim j%
- cnt = cnt + 1
- 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), ",") '最后的组合结果转换为数组sj2
- Call pldg2("", 0, 1) '然后对此组合结果调用【两两交换】算法的全排列递归过程
- End If
- Next
- End Sub
- Sub pldg2(s$, i%, t%) '【两两交换】算法的全排列递归过程,解释略
- cnt = cnt + 1
- 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
- Mid(s, (i - 1) * l + 1, l) = Mid(s, (i - 2) * l + 1, l)
- Mid(s, (i - 2) * l + 1, l) = sj2(t - 1)
- Call pldg2(s, i - 1, t)
- End If
- End Sub
复制代码 |
|