Язык R: Переменная не изменяется внутри цикла for ()? - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь проанализировать значение «edoActual», но оно не меняет своего значения после цикла for.

При запуске в RGui оно не указывает на ошибки илипредупреждения.При запуске на RStudio он сходит с ума.В любом случае это не работает.

edoActual = "q0";
print("Input cadena: ");
cadena <- scan("", what="char");

for(i in 1:length(cadena)) {
  if( edoActual == "q0" && cadena[i] == "a" ) {
    edoActual = "q1";
  }
  if( edoActual == "q0" && cadena[i] == "b" ) { 
    edoActual = "q0";
  }
  if( edoActual == "q1" && cadena[i] == "a" ) {
    edoActual = "q0";
  }
  if( edoActual == "q1" && cadena[i] == "b" ) {
    edoActual = "q1";
  }
  if( cadena[i] != "a" && cadena[i] != "b") {
    print("Error: invalid.");
    break;
  }  
}

if( i == length(cadena) ) {
  if(edoActual == "q1") {print("accepted (:");}
  if(edoActual == "q0") {print("rejected ):");}
}

Что должно произойти:

[1] "Input cadena: "
1: a
2: a
3: b
4: a
5:
Read 4 ítems

[1] "accepted (:" 

1 Ответ

2 голосов
/ 22 мая 2019

Переменная на самом деле слишком сильно меняется, потому что вы проверяете все операторы if на каждой итерации.

Таким образом, каждый раз cadena [i] == 'a' первый, если назначает 'q1' для edoActual, а затем, когда он достигает 3-го, если он снова становится 'q0'.

Я думаю, что вы действительно хотите проверить только первое правильное утверждение if. Поэтому, когда edoActual меняет свое значение, он переходит к следующей итерации. Вы можете сделать это, используя else, это гарантирует, что вы пройдете следующий тест, только если предыдущий был Ложным.

edoActual = "q0";
print("Input cadena: ");
cadena <- scan("", what="char");

for(i in 1:length(cadena)) {
  if( edoActual == "q0" && cadena[i] == "a" ) {
    edoActual = "q1";
  } else if( edoActual == "q0" && cadena[i] == "b" ) { 
    edoActual = "q0";
  } else  if( edoActual == "q1" && cadena[i] == "a" ) {
    edoActual = "q0";
  } else  if( edoActual == "q1" && cadena[i] == "b" ) {
    edoActual = "q1";
  } else if( cadena[i] != "a" && cadena[i] != "b") {
    print("Error: invalid.");
    break;
  }  
}

if( i == length(cadena) ) {
  if(edoActual == "q1") {print("accepted (:");}
  if(edoActual == "q0") {print("rejected ):");}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...