Пример цикла while, который нельзя записать как цикл for - PullRequest
6 голосов
/ 03 октября 2009

Я знаю, что цикл while может делать все, что может цикл for, но может ли цикл for делать все, что может цикл while?

Пожалуйста, приведите пример.

Ответы [ 6 ]

15 голосов
/ 03 октября 2009

Да, легко.

while (cond) S;

for(;cond;) S;
2 голосов
/ 03 октября 2009

Петля while и классическая петля for являются взаимозаменяемыми:

for (initializer; loop-test; counting-expression) {
    …
}

initializer
while (loop-test) {
    …
    counting-expression
}
1 голос
/ 04 октября 2009

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

С теоретической точки зрения они более слабые, чем общие циклы while, например, вы не можете вычислить функцию Аккермана только с такими циклами for.

Если вы можете указать верхнюю границу для условия в цикле while, чтобы оно стало истинным, вы можете преобразовать его в цикл for. Это показывает, что в практическом смысле нет никакой разницы, поскольку вы можете легко обеспечить астрономически высокую оценку, скажем, дольше, чем жизнь вселенной.

0 голосов
/ 24 июля 2018

Использование C

Основная предпосылка заключается в том, что цикл while можно переписать как цикл for. Такие как

init;
while (conditional) {
  statement;
  modify;
}

Переписывается как;

for ( init; conditional; modify ) {
  statements;
}

Вопрос основан на том, что операторы init и modify перемещаются в цикл for, а цикл for не просто является

init;
for (; conditional; ) {
  modify;
}

Но это вопрос с подвохом. Это неверно из-за внутреннего контроля потока, который может включать statements;. Из C Программирование: современный подход, 2-е издание , вы можете увидеть пример на странице 119,

n = 0;
sum = 0;
while ( n < 10 ) {
  scanf("%d", &i);
  if ( i == 0 )
    continue;
  sum += i;
  n++;
}

Это не может быть переписано как for как цикл,

sum = 0;
for (n = 0; n < 10; n++ ) {
  scanf("%d", &i);
  if ( i == 0 )
    continue;
  sum += i;
}

Почему, поскольку ", когда i равно 0, исходный цикл не увеличивается n, а новый цикл увеличивается.

И это, по сути, сводится к улову,

Явное управление потоком внутри цикла while разрешает выполнение, которое цикл for (с внутренними операторами init; и modify;) не может воссоздать.

0 голосов
/ 27 сентября 2012

While loop не обладает такой гибкостью, как for loop, и циклы for более читабельны, чем циклы while. Я бы продемонстрировал свою точку зрения на примере. Цикл for может иметь вид:

for(int i = 0, j = 0; i <= 10; i++, j++){
// Perform your operations here.
}

Цикл while нельзя использовать, как указано выше для цикла for, и сегодня большинство современных языков также допускают for each loop.

На мой взгляд, я могу быть предвзятым, простите за это, не следует использовать while loop, если возможно написать тот же код с for loop.

0 голосов
/ 03 октября 2009

В C-подобных языках вы можете объявить такие циклы:

for(; true;)
{
    if(someCondition)
       break;
}

В тех языках, где for является более строгим, бесконечные циклы могут потребовать цикл while.

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