|
还是用递归。
递归-1,用字典方法记录。
递归-2,用数组方法记录,并能返回+-符号结果。
过程中已经排除了重复,效率有所提高。
不过,和9楼直接数组循环方式比,还是慢了不少……这个是递归的短板。- Dim jg(), d, m%, k&
- Sub kagawa1()
- tms = Timer
- m = [a1]
- [c:d] = ""
-
- Set d = CreateObject("Scripting.Dictionary")
-
- Call dgH1("A+A", 0, 0)
-
- [c1].Resize(d.Count) = Application.Transpose(d.items)
- [d1].Resize(d.Count) = Application.Transpose(d.keys)
- [c1].CurrentRegion.Sort [c1], 1, [d1], , 1, , 2
- MsgBox "字典方法结果: " & d.Count & vbCr & Format(Timer - tms, "0.000s")
-
- End Sub
- Sub dgH1(s$, i%, t%)
- Dim j%
-
- d(s) = t + 2
-
- For j = i + 1 To m - 2
- If j <= t + 1 Then Call dgH1("A+" & s, j, t + 1)
- If j <= t + 1 Then Call dgH1("A-" & s, j, t + 1)
- Next j
-
- End Sub
- Sub kagawa2()
- tms = Timer
- m = [a1]
- [f:h] = ""
-
- ReDim jg(2 ^ (m - 1) - 1, 2)
-
- k = 0
-
- Call dgH2("+", "A+A", 0, 0)
-
-
- [f1].Resize(k, 3) = jg
- [f1].CurrentRegion.Sort [f1], 1, [h1], , 1, , 2
- MsgBox "数组记录递归方法结果: " & k & vbCr & Format(Timer - tms, "0.000s")
-
- End Sub
- Sub dgH2(r$, s$, i%, t%)
- Dim j%
-
- jg(k, 0) = t + 2: jg(k, 1) = r: jg(k, 2) = s: k = k + 1
-
- For j = i + 1 To m - 2
- If j <= t + 1 Then Call dgH2("+" & r, "A+" & s, j, t + 1)
- If j <= t + 1 Then Call dgH2("-" & r, "A-" & s, j, t + 1)
- Next j
-
- End Sub
复制代码 |
|