|
原来你参考的是狼版的大作……原理思路是正确的。
不过我的自定义函数还能比狼版略胜一筹: 大约快50-60%- Function SeqNum&(s$, m&)
- Dim i&, j&, k&, n&, t
- t = Split(s)
- n = UBound(t)
- For j = 0 To n - 1
- For i = i + 1 To t(j) - 1
- k = k + WorksheetFunction.Combin(m - i, n - j)
- Next
- Next
- SeqNum = k + t(n) - t(n - 1)
- End Function
复制代码 速度比较测试代码:- Sub SpeedCompare()
- Dim c&, i&, j&, m&, s$, tms#
-
- m = 49
- s = "24 29 33 37 40 45"
-
- c = 3 '代码反复运行次数c(10的幂指数)
- Debug.Print vbCr; "Run Count: "; Format(10 ^ c, "#,##0")
- For i = 1 To 2
- tms = Timer
- For j = 1 To 10 ^ c
- Run "Test" & i, s, m
- Next
- Debug.Print "Test" & i & ": " & Format(Timer - tms, "0.0000s")
- Next
- Debug.Print "k1:"; test1(s, m)
- Debug.Print "k2:"; test2(s, m)
- Debug.Print "--End--"
- End Sub
- Function test1(s$, m&) '你的函数,我把变量名按我的习惯改了
- Dim i&, j&, k&, n&, t
- t = Split(s)
- n = UBound(t) '组合个数n可以Ubound计算得到,不需要作为参数输入
- k = 1
- Do
- j = j + 1
- If j < t(i) Then
- k = k + WorksheetFunction.Combin(m - j, n - i)
- Else
- i = i + 1
- End If
- Loop Until j = t(n)
- test1 = k
- End Function
- Function test2(s$, m&) 'by kagawa
- Dim i&, j&, k&, n&, t
- t = Split(s)
- n = UBound(t)
- For j = 0 To n - 1
- For i = i + 1 To t(j) - 1
- k = k + WorksheetFunction.Combin(m - i, n - j)
- Next
- Next
- test2 = k + t(n) - t(n - 1)
- End Function
复制代码 我的算法采用两层For循环,比Do循环效率更高一些。
而且,最后一步是直接计算得到,减少了一次循环。
这个,大概就是我的代码算法效率更高一些的原因吧。
|
评分
-
1
查看全部评分
-
|