R,while(TRUE)如何工作?

时间:2013-09-22 09:28:30

标签: r loops while-loop

我必须编写以下方法的函数:

拒绝方法(统一信封)

假设fx仅在[a,b]和fx≤k上非零。

  1. 独立于X生成X~U(a,b)和Y~U(0,k)(所以P = (X,Y)均匀分布在矩形[a,b]×[0,k])上。

  2. 如果Y< fx(x)然后返回X,否则返回步骤1.

    rejectionK <- function(fx, a, b, K) {
        # simulates from the pdf fx using the rejection algorithm
        # assumes fx is 0 outside [a, b] and bounded by K
        # note that we exit the infinite loop using the return statement
    
        while (TRUE) {
          x <- runif(1, a, b)
          y <- runif(1, 0, K)
          if (y < fx(x)) return(x)
       }
    }
    
  3. 我还不明白为什么TRUE中有while (TRUE)

    如果(y while (FALSE)?

    再次以哪种方式进入while循环?也就是说,我习惯了这个

       a=5 
       while(a<7){
          a=a+1
       }
    

    这里我在写入条件(a&lt; 7)之前定义了一个。

    但在while (TRUE)中,哪个陈述是真的?

    此外:

    您可以运行代码

      rejectionK <- function(fx, a, b, K) {
            # simulates from the pdf fx using the rejection algorithm
            # assumes fx is 0 outside [a, b] and bounded by K
            # note that we exit the infinite loop using the return statement
    
            while (TRUE) {
              x <- runif(1, a, b)
              y <- runif(1, 0, K)
              cat("y=",y,"fx=",fx(x),"",y < fx(x),"\n")
              if (y < fx(x)) return(x)
           }
        }
    
      fx<-function(x){
         # triangular density
         if ((0<x) && (x<1)) {
           return(x)
         } else if ((1<x) && (x<2)) {
           return(2-x)
         } else {
           return(0)
         }
     }
    
     set.seed(123)
     rejectionK(fx, 0, 2, 1)
    

2 个答案:

答案 0 :(得分:10)

这是一个无限循环。只要条件求值为TRUE,表达式就会执行,它将始终执行。但是,在表达式中有一个return,当被调用时(例如,如果y < fx(x)),则会突破该函数,从而停止循环。

这是一个更简单的例子:

fun <- function(n) {
  i <- 1
  while (TRUE) {
    if (i>n) return("stopped") else print(i)
    i <- i+1
  }
}

fun(3)
#[1] 1
#[1] 2
#[1] 3
#[1] "stopped"

调用此函数会发生什么?

  1. i设置为1。
  2. 测试while循环的条件。因为它是TRUE,所以它的表达式被评估。
  3. 测试if构造的条件。由于FALSE评估else表达式并打印i
  4. i增加1。
  5. 重复步骤3和4。
  6. i达到值4时,if构造的条件为TRUE并评估return("stopped")。这将停止整个函数并返回值“已停止”。

答案 1 :(得分:4)

在while循环中,如果我们有带有true或false的return语句..它将相应地工作..

示例:要检查列表是否为循环..

这里循环是无限的,因为while(true)总是为真,但我们有时可以通过使用return语句来破坏。

while(true)
{
if(!faster || !faster->next)
return false;
else
if(faster==slower || faster->next=slower)
{
printf("the List is Circular\n");
break;
}
else
{
slower = slower->next;
faster = faster->next->next;
}