Re: [問題] 請問使用數量龐大的迴圈該如何精簡

看板Programming作者 (Alien)時間14年前 (2010/01/02 10:54), 編輯推噓3(304)
留言7則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《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

01/03 01:54, , 1F
強悍
01/03 01:54, 1F

01/09 03:15, , 2F
推超級強悍XD
01/09 03:15, 2F

01/13 13:52, , 3F
可是好處是什麼 ? 速度會快一點嗎?
01/13 13:52, 3F

01/14 18:06, , 4F
樓上說的是和什麼比較的好處?
01/14 18:06, 4F

02/05 03:27, , 5F
我覺得額外的好處是--碰到層數會變的迴圈
02/05 03:27, 5F

02/05 03:27, , 6F
比如一般以遞迴來處理的nested list
02/05 03:27, 6F

02/05 03:28, , 7F
這會是一種解決方案
02/05 03:28, 7F
文章代碼(AID): #1BFhLlQW (Programming)
文章代碼(AID): #1BFhLlQW (Programming)