|
本帖最后由 香川群子 于 2012-9-29 22:06 编辑
公布递归代码以及附件:
- Dim sj, jg(), m%, k, h% '设置公用变量
- Sub kagawa_2() '递归组合求和-2
- tms = Timer
- m = [a1].End(4).Row
- h = [b1]
- ' sj0 = [a1].Resize(m): [a1].Resize(m).Sort [a1], 1, , , 2 '如果原始数据乱序则先升序排序
- sj = [a1].Resize(m)
- ' [a1].Resize(m) = sj0 '排序处理后原始数据恢复原状
- ' ReDim jg(65536, 0)
- k = 0
-
- Open "D:\Result.txt" For Output As #1 '打开记事本文件用来保存输出结果,文件地址可以自己修改
- ' Open "D:\Documents\Result.txt" For Output As #1
- ' Open "D:\Backup\我的文档\Result.txt" For Output As #1
-
- Print #1, m & " / " & h '输出结果写入文件头信息
-
- Call dgH2("", 0, 0, 0) '调用递归过程开始计算
-
- Print #1, "Result: " & k & "/ Time: " & Format(Timer - tms, "0.000s") '输出结果写入文件尾信息
- Close #1 '关闭记事本文件
- ' If k < 65536 Then [d1].CurrentRegion = "": [d1].Resize(k) = jg
- MsgBox "Result: " & k & " Time: " & Format(Timer - tms, "0.000s")
- End Sub
- Sub dgH2(s$, r, i%, t%) '关键的递归过程代码
- Dim j%
-
- If h - r >= sj(i + 1, 1) Then
- '直接计算h-r即【目标值】-【当前结果】作为【计算末位值】,如果该末位值大于等于递归下一位置值则符合条件。
- ' If k < 65536 Then jg(k, 0) = s & "+" & h - r
- ' Print #1, s & "+" & h - r '向记事本中写入本次递归计算结果。即【当前递归和r】+【计算末位值h-r】
- k = k + 1
- End If
-
- For j = i + 1 To m
- If h - r - sj(j, 1) < sj(j + 1, 1) Then
- Exit Sub '提前计算下一递归结果的【末位计算值h - r'】是否有效,无效则退出递归循环r'=r + sj(j, 1)
- Else
- Call dgH2(s & "+" & sj(j, 1), r + sj(j, 1), j, t + 1)
- End If
- Next j
- End Sub
复制代码 从结果看,代码算法的改变不是特别复杂。但效果显著。
|
评分
-
1
查看全部评分
-
|