Если оператор (ы) вместо цикла while - PullRequest
0 голосов
/ 08 марта 2019

Этот вопрос довольно странный, однако я попросил друга спросить, возможно ли это, и я не смог дать ему ответ.Можно ли написать следующий цикл while, используя вместо этого операторы if?

while (!x.empty() && !y.empty()){}

Я думал, что вы могли бы обойтись используя цикл while, если бы у вас был вложенный оператор if, который, возможно, устанавливал флаг?Есть еще мысли?

Извините за глупый вопрос.

Ответы [ 5 ]

1 голос
/ 08 марта 2019

Вы можете использовать оператор break внутри цикла while с оператором if-else

while (1)
{
    if (!x.empty() && !y.empty()) 
    {
         // do something;
    }
    else break;
}
0 голосов
/ 09 марта 2019

Вы можете поставить под угрозу читабельность кода и добиться этого с помощью рекурсии. Помните, что это сделает код более сложным, чем это необходимо. Рекурсии потребуется больше места в стеке, чем в обычном итеративном коде. Я бы сделал что-то вроде этого -

//iterative
while (!x.empty() && !y.empty()) {
  //do something
}
//recursive
void recursion(vector<int> x, vector<int> y){
  if(!x.empty() && !y.empty()) {
    //do something

    //remove element from vector based on your condition

    x.pop_back();
    y.pop_back();
    recursion(x, y);
  } 
}

Условие выхода для рекурсии - любой из векторов пуст.

0 голосов
/ 09 марта 2019

Не напрямую, но по-другому, без использования while ... хорошего выражения ole goto ..

int main()
{
    ....
start:
    if(!x.empty() && !y.empty())
        goto start;
    ....
 }
0 голосов
/ 08 марта 2019

Другой способ: рекурсия

#include <stack>
#include <boost/hof.hpp>

int main()
{
    extern std::stack<int> get();

    auto x = get();
    auto y = get();

    auto f = boost::hof::fix([&](auto self)
    {
        if (!x.empty() && !y.empty())
        {
            x.pop();
            y.pop();
            self();
        }
        return 0;
    });

    boost::hof::result<int>(f)();
}

https://godbolt.org/z/M-JkV2

0 голосов
/ 08 марта 2019

Несколько. Вы можете сделать это с помощью рекурсивных вызовов функций. как:

void whileLoop(){
   if(!(!x.empty() && !y.empty())){
      return;
   }

   //Code to run in loop here

   whileLoop();
}

вы вызываете функцию, когда хотите запустить цикл. обратите внимание на знак not перед условием, которое вы проверяли в исходном цикле; как если бы условие больше не выполнялось, код цикла не запустился бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...