2013-09-22 3 views
5

я должен написать функцию следующего метода:R, Как работает (TRUE)?

метод отклоняющий (Uniform конверт):

Предположим, что FX отлична от нуля только на [а, Ь], и FX ≤ K.

  1. Генерация Х ~ U (а, б) и У ~ V (0, к) не зависит от X (так P = (X, Y) равномерно распределены по прямоугольника [а, Ь] × [0, k]).

  2. Если Y < FX (х), а затем вернуться 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) 
        } 
    } 
    

Я не понял, почему это TRUE в while (TRUE)?

if (y < fx (x)) не является истинным, тогда метод предлагает повторить цикл снова, чтобы снова создать единое число. (y < fx (x)) не соответствует true = FALSE. Итак, почему условие не должно быть while (FALSE)?

Снова в каком основании я получу вход в цикл while? То есть, я привык с этим

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

здесь я определяю, прежде чем писать условие (а < 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) 

ответ

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"). Это останавливает всю функцию и возвращает значение «остановлено».
+0

Прошу прощения. Я еще не понял. Какое утверждение должно быть ИСТИННЫМ? i> n или i

+1

Извините, я не понимаю ваш вопрос. – Roland

+0

, когда i = 1, почему я вхожу в цикл? 1 не больше 3, поэтому это ЛОЖЬ, и мне нужно повторить цикл, пока он не вернется «остановлен». следовательно, почему не является условием 'while (FALSE)', чтобы я мог войти в цикл. –

3

Внутри в то время как цикл, если мы имеем обратный оператор с истинным или ложным .. он будет работать соответственно ..

Пример: Проверьте список круговой или нет ..

здесь петля бесконечно, потому что 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; 
} 
Смежные вопросы