我最近解决了一个问题。但我有一段代码,我不使用for循环初始化和条件检查。对于for循环来说,这看起来有点奇怪。我想将它转换为while循环。请帮帮我。我尝试了很多次,但某处缺少某些东西。
for(;;current =(current+1)%n){
if(eliminated[current%n]){
continue;
}else{
inkiPinki++;
if(inkiPinki == m){
eliminated[current%n] = true;
printStatus(eliminated, people);
remainingGuys--;
break;
}
}
}
在上面的代码中,消除的[index]是一个布尔值。
编辑:感谢Geoff为我提供了一个解决方案,我进一步将其最小化。
while( eliminated[current] || ++inkiPinki != m )
current = (current+1) % n;
eliminated[current] = true;
printStatus( eliminated, people );
remainingGuys--;
答案 0 :(得分:2)
可以使用以下模式将所有for循环转换为while循环:
for (..xxx..; ..yyy..; ..zzz..) {
..aaa..
}
变为
...xxx...
while (...yyy...) {
..aaa..
..zzz..
}
记住
for (;;) {
..aaa..
}
相当于
for (nop; true; nop) {
..aaa..
}
其中“nop”表示无操作。
在你的例子中,这将使你的循环:
for(;;current =(current+1)%n){
if(eliminated[current%n]){
continue;
}else{
inkiPinki++;
if(inkiPinki == m){
eliminated[current%n] = true;
printStatus(eliminated, people);
remainingGuys--;
break;
}
}
}
相当于
// no initialzation needed
while(true) {
//if(eliminated[current%n]){
// continue;
//}else{
if(!eliminated[current%n]){
inkiPinki++;
if(inkiPinki == m){
eliminated[current%n] = true;
printStatus(eliminated, people);
remainingGuys--;
break;
}
}
current =(current+1)%n;
}
如果您愿意,可以从那里进一步简化。
答案 1 :(得分:1)
尝试
while( true ) {
if( !eliminated[current] ) {
if( ++inkiPinki == m ) {
break;
}
}
current = (current+1) % n;
}
eliminated[current] = true;
printStatus( eliminated, people );
remainingGuys--;
它应该在逻辑上等同。
答案 2 :(得分:1)
我该怎么做:
while (inkiPinki < m) {
if (!eliminated[current % n]) {
inkiPinki++;
if (inkiPinki == m) {
eliminated[current % n] = true;
}
}
if (inkiPinki < m) {
current = (current + 1) % n;
}
}
printStatus(eliminated, people);
remainingGuys--;
此代码完成与原始for循环完全相同的操作,除了它使用逻辑测试来确定它是否应该继续循环。不需要continue
或break
。如果您发现自己正在使用这些语句中的任何一个,那么可能需要进行一些重构。
答案 3 :(得分:0)
我似乎对使用布尔值作为整数非常喜欢:
for (;inkiPinki<m; inkPinki += !eliminated[current])
current = (current + 1) %n;
eliminated[current] = true;
printStatus(eliminated, people);
remainingGuys--;
我还在几个地方将current%n
更改为current
,因为%n
已经在电流增加时完成,所以current
应该已经减少模n
。
如果我这样做,我可能会改变感觉,所以不是eliminated
,而是remaining
:
for (;inkiPinki<m; inkPinki += remaining[current])
current = (current + 1) %n;
remaining[current] = false;
printStatus(remaining, people);
remainingGuys--;