2010-04-28 161 views
1

我最近解决了一个问题。但是我有这样一段代码,我不使用for循环初始化和条件检查。 For循环看起来有点奇怪。我想将它转换为while循环。请帮我做。我尝试了很多次,但有些地方丢失了东西。需要将此循环转换为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

为什么你需要这样的'while'?也许你只想简化这个循环? – SergGr 2010-04-28 16:26:05

+0

@iPhone beg:是的 – bragboy 2010-04-28 16:28:02

+0

从您的编辑,我不知道你想要什么?这段代码肯定属于循环内部? – Geoff 2010-04-28 16:29:25

回答

1

尝试

while(true) { 
    if(!eliminated[current]) { 
     if(++inkiPinki == m) { 
      break; 
     } 
    } 
    current = (current+1) % n; 
} 
eliminated[current] = true; 
printStatus(eliminated, people); 
remainingGuys--; 

它应该是逻辑上等同。

+0

这个我试过了,但最后一行当前=(当前+ 1)%n执行不会发生,如果遇到继续 – bragboy 2010-04-28 16:25:49

+0

是的,对不起,我修好了。 – Geoff 2010-04-28 16:26:07

+0

嗨,请参阅我的编辑 – bragboy 2010-04-28 16:27:45

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。如果您发现自己使用这些语句中的任何一个,那么可能会有一些重构应该完成。

+0

尝试了你的代码。它不工作。 – bragboy 2010-04-28 16:36:18

+0

你可以请求合格的“它不工作”?另外,请问现在的修订是否可以再试一次? – 2010-04-28 16:41:03

+0

嗨,我现在尝试仍然失败..谢谢你的努力 – bragboy 2010-04-28 16:50:32

2

所有环可被转换,同时使用以下模式循环,以:

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

循环体中的“继续”不会打破你的转换吗? – 2010-04-28 17:48:19

+0

要注意,继续不会导致跳过更新时转换为另一个循环;我纠正了代码,因为它纠正了它是最好的答案,因为它最接近于原始代码,我想加注它。 – 2010-04-28 18:26:09

+0

感谢您的更新。是的,循环体的继续打破了转变。我在写这篇文章时肯定需要一杯额外的咖啡,并且再次感谢修正。 – 2010-04-29 12:56:41

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