需要将此for循环转换为while循环

时间:2010-04-28 16:20:25

标签: java for-loop while-loop

我最近解决了一个问题。但我有一段代码,我不使用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--;

4 个答案:

答案 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循环完全相同的操作,除了它使用逻辑测试来确定它是否应该继续循环。不需要continuebreak。如果您发现自己正在使用这些语句中的任何一个,那么可能需要进行一些重构。

答案 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--;