2015-01-06 2 views
-2

Итак, я очень хорошо понимаю программирование ... но в последнее время я сталкивался с циклами и особенно с вложенными. Я просто не могу понять. Он просто не войдет в мою голову. Может ли кто-нибудь дать мне несколько советов о том, как лучше воспринимать эти петли (или ... вообще)?Нелегко понять для циклов и вложенных для циклов

Заранее спасибо

ответ

1

Когда мы размещаем одну петлю внутри тела другого цикла, называется вложенным циклом. И внешняя петля возьмет под контроль количество полных повторений внутренней петли, что означает, что внутренняя петля в приведенном ниже примере будет работать не менее 10 раз из-за условия a < 10.

В приведенном ниже примере «Печать B "появится 200 раз, т. е. 20 * 10. Внешний контур A будет запускать внутренний контур B 10 раз. А поскольку внутренний цикл B сконфигурирован для работы в 20 раз общего количества раз печати B появится в 200.

// Loop: A 
for(int a=0;a< 10;a++) { 
    // Loop: B 
    for(int b=1;b<20;b++) { 
     System.out.println("Print B"); 
    } 
} 
1

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

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

т.е.

for(int i = 0; i < 10; i++) 
    { 
     int x = i; 
    } 

В коде здесь (C++), итератор я, и блок кода INT х = я. Это означает, что блок кода будет выполнен из г = 0, чтобы я = 9, каждый раз, когда установки х в I, а затем увеличивая значение I на 1.

Здесь Вы можете увидеть еще одно описание: C++ For Loops

И если вы работаете в Java: Java For Loops

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

т.е.

for(int i = 0; i < 3; i++) 
    { 
     for(int j = 0; j < 5; i++) 
     { 
     int x = j; 
     } 
    } 

Здесь вы видите, что каждый раз, когда вы выполняете код внутри первого для цикла, вы будете выполнять код внутри внутренний цикл для завершения, или до тех пор, J не равен 5. Тогда вы итерацию внешний цикл и запустить его снова.

Надеюсь, это поможет.

3

Программа описывает последовательность операций для компьютера для выполнения. Среди этих операций могут быть некоторые подпоследовательности, которые компьютер должен повторять несколько раз. Вместо того, чтобы буквально повторять эти подпоследовательности соответствующее количество раз в исходном коде программы (что во многих случаях невозможно), вы можете использовать конструкцию, которая сообщает компьютеру, что в конце такой подпоследовательности он должен вернуться или «зацикнуть» назад к началу этой подпоследовательности. Эти типы конструкций условно называются «петлями».

В некоторых случаях повторяющаяся подпоследовательность самих операций содержит подпоследовательность операций, которая должна повторяться несколько раз как часть выполнения одной итерации содержащейся последовательности. Это тоже можно представить с помощью конструкции цикла.


Пример: алгоритм для очистки окон в моем доме

  1. Получить моющие средства из шкафа
  2. Если больше нет грязных окон, то остановиться. Else,
  3. Перейти к следующему грязному окну.
    1. Спрей-очиститель
    2. Протрите окно
    3. Если это не достаточно чистый, то вернитесь к шагу 3,1
  4. Вернитесь к шагу 2.

Это имеет две петли: внешнее один из которых содержит каждый шаг, кроме первого, и внутренний, содержащий этапы с 3.1 по 3.3.


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

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

С другой стороны, что-то должно измениться с итерации на итерацию, иначе повторение никогда не остановится. В простейшем случае вещь, которая изменяется на триггер, в конечном итоге прерывается от цикла, (абстрактно) - количество уже выполненных итераций цикла. Часто, однако, нам нужна более гибкая оценка того, нужны ли еще итерации, например, «достаточно ли еще окна?»

Катушка for C/Java формализует эти три элемента: инициализация (получение расходных материалов), условие завершения (есть ли более грязные окна?) И обновление (переход к следующему окну). Шаг инициализации выполняется один раз, перед первой итерацией. Условие завершения тестируется перед каждой итерацией (и цикл завершается, если он оценивается до false), а шаг обновления выполняется после каждой итерации перед тестированием условия завершения для следующей итерации. Когда цикл завершается нормально, компьютер следующий выполняет оператор сразу после тела цикла.

Чтобы продолжить глупый пример:

for (
    int window_number = 0; 
    window_number < TOTAL_NUMBER_OF_WINDOWS; 
    window_number = window_number + 1) { 

    Window currentWindow = windows[window_number]; 

    do { 

     cleaner.spray(currentWindow); 
     cloth.wipe(currentWindow); 

    } while (currentWindow.isDirty()); 

} 

В этом случае я представлял внутреннюю петлю с другой конструкцией петли (do { ... } while), так как он подходит более естественно с фактами, что есть ни один шаг инициализации не требуется, я не нужно проверять завершение до первой итерации, а шаг обновления выполняется внутри тела цикла. Тем не менее, на самом деле было бы неинтересно тестировать условие завершения до первой итерации, однако я могу написать внутренний цикл как цикл for.Я просто оставить части мне не нужен пустой (но я всегда нужны два точкой с запятой разделителей):

for (
    int window_number = 0; 
    window_number < TOTAL_NUMBER_OF_WINDOWS; 
    window_number = window_number + 1) { 

    Window currentWindow = windows[window_number]; 

    for (
     /* no initialization */ ; 
     currentWindow.isDirty(); 
     /* no (additional) update */) { 

     cleaner.spray(currentWindow); 
     cloth.wipe(currentWindow); 

    } 

} 

И это все, что вам нужно знать о циклах в целом и for петель, в частности.

Смежные вопросы