✔ 最佳答案
以快速而言, N層 FOR 的寫法是最快的 ~
(如美香大的寫法)
但彈性較低 ~
2009-09-04 12:21:19 補充:
不才提供三種寫法參考 :
1. N 層 FOR
2. For i = 1 to 2^N
3. 遞迴
2009-09-04 18:04:20 補充:
"第四種算法"
耶 ~
這不才可有興趣了 ~
未知是何種算法呢 ?
2009-09-04 18:09:18 補充:
猜猜看 :
do loop 嗎 ?
2009-09-04 19:51:49 補充:
應該不是 ~
個人以為 vb 應該沒法,
for i = 1 to 2^100 就跑到暈了 ~
不然就得加些數學吧 !?
學海無涯, 以有涯隨無涯, 累 !!
呵呵 ~
2009-09-04 22:40:02 補充:
非質疑, 愚意是 :
應該非單純 vb 功能,
(掛了啥或呼叫了啥 ~ )
(低階語言速度快 ! )
或者是用了數學當工具 ~
(這或許更有可能 ... 只是我還須思考 ~ )
2009-09-04 22:40:07 補充:
因為空的 100 層 FOR i = 1 to 2 的時間,
與空的 For i = 1 to 2^100 的時間大致是一樣的 ~
vb 連跑空的 For i = 1 to 2^N 都不知要跑多久了 ~
2009-09-04 22:55:55 補充:
遞迴這兩天會寫完再 po 上,
給興趣的大大參考 ~
^ ^
2009-09-05 01:58:54 補充:
"去除枉跑"
這就是數學 ~
^^
它只跑局部區塊, 一些細節得細思 ~
2009-09-05 02:03:51 補充:
但該類解法個人不認為是通解 ~
(可說是妙解, 靠的是數學, 邏輯, 才能定義出可免的區塊 ~ )
(限制也大 ... )
2009-09-05 13:38:22 補充:
要先說的是 : 遞迴一樣是遍歷的作法,
它的速度應該跟N層for一樣 ~
如果要去除枉跑, 要靠數學, 要加入判斷, 不必要的迴圈不跑 ~
屬於變化, 不屬於基本解法 ~
2009-09-05 14:03:51 補充:
http://www.FunP.Net/301880
FOR I = 1 to 2^N 敝解 ~
除了程式碼看起來條理外, 無啥特點 ~
^ ^
2009-09-05 22:29:05 補充:
如有負數, 此行需蓋掉 :
If vT > v0 Then GoTo Nx
可以有勞美香大給沒找到的範例嗎 ? 較快 ~
如有, 應該是變數型態的問題吧 ?
2009-09-05 23:33:31 補充:
1. 此與排序不同 ~
2. 2^N 問題確實在此(變數有其大小限制), 所以可考慮用 "遞迴" ~
3. 此類題型之 "數字題" , 可能會有數學方式, 結果如 夏日兄 所提到的高速處理,
但當延伸至文字時, 則無迂迴之路 ~
4. "數值一多時, 就成龜速"
為何現在密碼愈規定愈多字, 還需特殊符號,
這不是沒理由的 ~ 講的是同件事 ~
"無迂迴之路"
2009-09-06 00:38:11 補充:
更正 018
遞迴快頗多, 我也在想為什麼
>.<
稍作檢查後再貼 ~
2009-09-06 00:56:14 補充:
遞迴解 :
http://www.FunP.Net/986175
程式碼 :
Dim Mx, MxO() As String, CntMxO As Long
Sub Recur()
Dim Tm As Single: Tm = Timer
CntMxO = 0
Mx = Sheet1.[A1].CurrentRegion.Columns(1)
Dim CntMx As Byte: CntMx = UBound(Mx, 1)
Dim vTarget As Single: vTarget = Sheet1.[C1]
Dim vTmp As Single
Sheet1.[D:D].Clear
RCyc 1, CntMx, vTarget, vTmp
[D1].Resize(CntMxO, 1).Value = Application.Transpose(MxO)
[C5] = Timer - Tm
MsgBox CntMxO & "解", , "WLZ"
End Sub
Function RCyc(SN As Byte, CntMx As Byte, vTarget As Single, vTmp As Single, Optional StrTmp As String)
If SN > CntMx Then
If vTmp = vTarget Then
CntMxO = CntMxO + 1
ReDim Preserve MxO(1 To CntMxO) As String
MxO(CntMxO) = StrTmp
End If
Else
RCyc SN + 1, CntMx, vTarget, vTmp, StrTmp
RCyc SN + 1, CntMx, vTarget, vTmp + Mx(SN, 1), StrTmp & "+" & Mx(SN, 1)
End If
End Function
---
有疑問請再提出討論 ~
2009-09-06 15:14:07 補充:
運用於小數時, 請將 :
If vTmp = vTarget Then
改為 :
If Abs(vTmp - vTarget) < 0.0001 Then
此為變數型態問題 ~
2009-09-06 15:25:15 補充:
也適用於小數的版本 :
http://www.FunP.Net/865936
更動 :
1. If vTmp = vTarget Then >>> If Abs(vTmp - vTarget) < 0.00001 Then
2. 變數型態 : single >>> double
2009-09-06 15:33:15 補充:
輸出文字檔會更快
redim preserve 速度跟 collection 速度差不多, 都是算慢的 ~
2009-09-06 22:46:20 補充:
http://www.FunP.Net/394135
在此說明的是 :
此解為基礎形式,
用的是 "遍歷, 全掃" 方式 ~
因為全掃,
所以比起 美香大 提供網址上的範例是遠不如的 ~
(全部用到數學 ~ )
但使用數學最少, 而應用範圍最廣 !!