73

我想知道如何编写 do-while-style 循环?

我找到了这篇文章

您可以使用 repeat{} 并在任何地方使用 if() 检查条件并使用“break”控制字退出循环。

我不确定它到底是什么意思。如果您理解它和/或如果您有不同的解决方案,有人可以详细说明吗?

4

4 回答 4

137

很不言自明。

repeat{
  statements...
  if(condition){
    break
  }
}

或者我想的类似的东西。要获得 do while 循环的效果,只需在语句组末尾检查您的条件。

于 2010-12-05T07:33:52.913 回答
29

请参阅?ControlR 语言定义:

> y=0
> while(y <5){ print( y<-y+1) }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

所以do_while在 R 中不作为单独的构造存在,但您可以使用以下方法伪造它:

repeat( { expressions}; if (! end_cond_expr ) {break} )

如果您想查看帮助页面,您不能在控制台输入?whileor?repeat而是需要使用?'repeat'or ?'while'。所有“控制结构”包括if在同一页面上,并且都需要在“?”之后引用字符。所以解释器不会将它们视为不完整的代码并给你一个延续“+”。

于 2010-12-05T13:18:49.840 回答
6

在其他答案的基础上,我想分享一个使用 while 循环结构来实现 do-while 行为的示例。通过在 while 条件中使用一个简单的布尔变量(初始化为 TRUE),然后稍后在 if 语句中检查我们的实际条件。也可以在 if 语句中使用 break 关键字而不是 continue <- FALSE(可能更有效)。

  df <- data.frame(X=c(), R=c())  
  x <- x0
  continue <- TRUE

  while(continue)
  {
    xi <- (11 * x) %% 16
    df <- rbind(df, data.frame(X=x, R=xi))
    x <- xi

    if(xi == x0)
    {
      continue <- FALSE
    }
  }
于 2016-03-06T13:08:42.313 回答
1

注意到用户 42- 的完美方法{
* "do while" = "repeat until not"
* 代码等价:

do while (condition) # in other language
..statements..
endo

repeat{ # in R
  ..statements..
  if(! condition){ break } # Negation is crucial here!
}

}没有得到其他人的足够重视,我将通过一个具体的例子来强调和提出他的方法。如果不否定 do-while 中的条件(通过!或通过否定),则根据代码的过程存在扭曲的情况(1. 值持久性 2. 无限循环)。

在高斯:

proc(0)=printvalues(y);
DO WHILE y < 5;    
y+1;
 y=y+1;
ENDO;
ENDP;
printvalues(0); @ run selected code via F4 to get the following @
       1.0000000 
       2.0000000 
       3.0000000 
       4.0000000 
       5.0000000 

在 R 中:

printvalues <- function(y) {
repeat {
 y=y+1;
print(y)
if (! (y < 5) ) {break}   # Negation is crucial here!
}
}
printvalues(0)
# [1] 1
# [1] 2
# [1] 3
# [1] 4
# [1] 5

仍然坚持认为,如果不否定 do-while 中的条件,Salcedo 的答案是错误的。可以通过删除上述代码中的否定符号来检查这一点。

于 2017-06-16T21:44:07.580 回答