作者adrianshum (Alien)
看板Programming
標題Re: [問題] 請問使用數量龐大的迴圈該如何精簡
時間Sat Jan 2 10:54:36 2010
※ 引述《comduffer ()》之銘言:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 115.81.151.46
: 推 wa120:遞迴@@? 140.133.9.113 01/02 09:51
: 推 bigpigbigpig:你可以用一個 array 和一個 level 118.160.70.193 01/02 10:13
: → bigpigbigpig:變數,將它們包裝成一個物件,然後 118.160.70.193 01/02 10:14
: → bigpigbigpig:一直踢 (increment) 它,就可以得到 118.160.70.193 01/02 10:15
: → bigpigbigpig:目前組態,若傳回 false 代表結束, 118.160.70.193 01/02 10:15
: → bigpigbigpig:就像 STL 的 next_premutation 一樣 118.160.70.193 01/02 10:16
: → bigpigbigpig: next_permutation 118.160.70.193 01/02 10:25
: → comduffer:抱歉我程度太差 聽不董 115.81.151.46 01/02 10:33
: → comduffer:我的程度只有剛學程式的中學生那樣吧 115.81.151.46 01/02 10:33
他的意思,你可以這樣理解:
假設你要做 (以下全是 psuedo code)
for i = 1 to a
for j = 1 to b
for k = 1 to c
// do something
究竟做了多少次 "do something"?
其實就是 a*b*c 那麼多次,那麼把它改成:
for x = 1 to (a*b*c)
// do something
但你要怎麼知道每次 iteration 的 x 代表的 i j k 是什麼?
其實就是
for x = 1 to (a*b*c)
i = x / a + 1
j = (x mod a) / b + 1
k = x mod c + 1
// do something
但這樣寫 a*b*c 可能大於整數上限,所以不如就:
int vars[3] = {1,1,1} // 三個 element 長的 array, 代表 i,j,k
int varLimits[3] = {a,b,c} // 記錄每個的上限
while (increment(vars, varLimits) != false)
// do something
function boolean increment(int[] vars, int[] varLimits) {
// 自己想想怎麼寫
// 大概是先 increment vars 的第一個數字 (k),要是達到對應的
// 上限,就設回 1, 並 increment 下一個數字,如此類推
}
意思就是這樣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.77.15.226
推 willhunting:強悍 74.68.114.250 01/03 01:54
推 z220:推超級強悍XD 61.57.103.14 01/09 03:15
推 makeman:可是好處是什麼 ? 速度會快一點嗎? 211.22.55.187 01/13 13:52
→ adrianshum:樓上說的是和什麼比較的好處? 202.155.236.82 01/14 18:06
→ sunneo:我覺得額外的好處是--碰到層數會變的迴圈 118.171.85.102 02/05 03:27
→ sunneo:比如一般以遞迴來處理的nested list 118.171.85.102 02/05 03:27
→ sunneo:這會是一種解決方案 118.171.85.102 02/05 03:28