这个问题...
usrbin吧
全部回复
仅看楼主
level 13
KeyTo9 楼主
for i 从1到100
for j 从1到100
for k 从1到100
...计算..
程序中止在i=30,j=40,k=50
希望下一次从i=30,j=40,k=50开始继续运算,如何处理?
难道只能在每个for的时候处理初值? 比如 for(k=(刚开始)?50:1 ..) ,那么这 刚开始 的标志在什么地方关掉呢..
我又想到,把三个for合成一个,初值就可以由命令行轻松传入
for(i=30,j=40,k=50;i<=100;){
..
   if(++k>100) {
    k=1
    if(++j>100){
       j=1
        i++
    }
   }
}
这样的效率又如何?
什么汇编什么编译原理我都不懂!!!您有更好的解决方案吗?[烧香]
2011年02月15日 04点02分 1
level 11
很明显,最高效的算法应该是下面的顺序执行形式(汇编后的代码没有JNZ,CMP比较和跳转指令,就算代码优化这些指令也是不可避免的)
void forHead(int a,int b,int c){
     int i = a,j = b,k;
     for(k = c;k <= 100;++ k) cal();
     for(++j;j <= 100;++j) for(k = 1;k <= 100;++k) calc();
     for(++i;i <= 100;++i) for(j = 1;j <= 100;++j) for(k = 1;k <= 100;++k) calc();
}
倘若你觉得这么些过于"麻烦",也可以采用你的两个方案,效率如何呢?if(++k > 100)要执行O(n^3)次,if(++j > 100)要执行O(n^2)次(n是每重循环变量的最大取值),在现代典型的2.0G HZ双核CPU上,n=100大约额外耗时3*10^(-3)s,n=1000额外耗时3s(gcc,O2-优化)。所以在程序效率和代码风格见你可以自行抉择[倒立]不过我认为第一个方案(j = i == 30 ? j : 1)更好,因为现代的C/C++编译器对于三目操作符都给与了更多的优化(不允许long jump)[苹果]
2011年02月15日 10点02分 2
level 13
KeyTo9 楼主
啊,您的方法看起来真好啊,您应该看出我这问题的目的了,当然只要效率,不要风度/风格了。
如果是不确定深度的递归,似乎很难解决了,这个先不管了。
把calc()的代码代入到forHead()后,效率应该稍高些吧,那样做,难道要使用传说中的宏[瀑布汗~]

2011年02月15日 11点02分 3
level 11
回复:3楼
可以定义calc()为内联函数(inline),如此做函数代码会被放入符号表,等价于一般的宏展开[苹果](只是函数体不能太大)
2011年02月15日 11点02分 4
level 13
KeyTo9 楼主
不太大就奇了[瞌睡]
膜拜一下[我错了],匿了
2011年02月15日 11点02分 5
level 11
回复:5楼
[歪头]函数有多大?
2011年02月15日 11点02分 6
level 13
KeyTo9 楼主
我问这问题是为未来做准备的。现在无法回答[Yeah]
2011年02月15日 12点02分 7
1