作者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
1F:推 willhunting:强悍 74.68.114.250 01/03 01:54
2F:推 z220:推超级强悍XD 61.57.103.14 01/09 03:15
3F:推 makeman:可是好处是什麽 ? 速度会快一点吗? 211.22.55.187 01/13 13:52
4F:→ adrianshum:楼上说的是和什麽比较的好处? 202.155.236.82 01/14 18:06
5F:→ sunneo:我觉得额外的好处是--碰到层数会变的回圈 118.171.85.102 02/05 03:27
6F:→ sunneo:比如一般以递回来处理的nested list 118.171.85.102 02/05 03:27
7F:→ sunneo:这会是一种解决方案 118.171.85.102 02/05 03:28