Вложено для циклов? - PullRequest
1 голос
/ 17 ноября 2010

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

Скажите, как мне справиться с вложенными циклами? Где мне начать практиковать?

Однажды мои преподаватели сказали нам, что любое приложение, которое использует меньше для циклов, является наиболее эффективным. Это реально?

Предложите мне любой book или paper on for loops или links !!

deceze How about you give us an example nested loop and tell us what you don't understand about it?

Я не могу объяснить это полностью. Всякий раз, когда я начинаю думать о функции, которой нужно 2 для циклов (вложенных), первые две итерации проходят гладко. После этого, если я добавлю какие-либо другие вычисления во внутренний цикл, через секунду все исчезнет. Я не могу продолжать. Итак, я должен запустить цикл на ПК как меньший, а затем сделать его полностью функциональным.

Хорошо, оставь меня. What you all do, i mean, how you start if you have to build a function which needs more than 2 nested for loops.

Ответы [ 4 ]

5 голосов
/ 17 ноября 2010

Suggest me any book or paper on for loops or links!!

Чтобы закрепить ваше понимание 2 для петель, вы можете попробовать потренироваться на http://www.codingbat.com/java - более того, есть мгновенная и (в основном) полная оценка! Задачи String-3 или Array-3 могут использовать 2 для циклов.

Если у вас есть двумерный массив, и вам нужно достичь всех индексов, вы можете использовать 2 для циклов. Таким образом, аналогично, если у вас есть 3D-массив, вы можете использовать 3 вложенных цикла. Помните, что внутренняя часть цикла заканчивается раньше внешней, поэтому, если у вас есть 2 цикла, внутренний код будет циклически повторяться в течение времени, которое указывает внутренний цикл, в течение количества раз, которое указывает внешний цикл. Вы можете нарисовать диаграмму:

for(int i = 0; i < 2; i++) {
  for(int j = 0; j < 2; j++) {
    for(int k = 0; k < 2; k++) {
      //do something
    }
  }
}

Визуальное представление:

i:      0-----------1
        |           |
j:   0-----1     0-----1
     |     |     |     |
k: 0---1 0---1 0---1 0---1

Если я назначу буквы:

i:      A-----------B
        |           |
j:   C-----D     E-----F
     |     |     |     |
k: G---H I---J K---L M---N

, где X1 является первой частью X (перед вложенным циклом for), а X2 - второй частью (после вложенного цикла for), порядок выполнения:

A1, C1, G, H, C2, D1, I, J, D2, A2, B1, E1, K, L, E2, F1, M, N, F2, B2

Так что вам не нужно изображать n-мерные массивы, когда вы смотрите на петли.

Однажды мои преподаватели сказали нам, что любое приложение, которое использует меньше для циклов, является наиболее эффективным. Это реально?

Если ваш цикл for предполагает вычисление значения, подобного формуле, было бы быстрее и, возможно, более эффективно просто вставить элементы в формулу. Но, как правило, самый медленный алгоритм Big O будет влиять на эффективность программы больше всего - так что отдельный цикл for, который зависит от n (как условие остановки), не будет сильно замедлять программу, если он также будет вложен в циклы которые зависят от n.

1 голос
/ 26 апреля 2011

Цитируется из «Код завершен» в виде краткой формы " 16,3. Простое создание петель - изнутри Вы можете использовать простую технику, чтобы сделать это правильно с первого раза.

Начните с одного случая. Код этого случая с литералами.

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

Поместите еще один цикл вокруг этого, если необходимо, и замените больше литералов. Продолжайте процесс столько, сколько вам нужно.

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

"

1 голос
/ 17 ноября 2010

(надеюсь, я хорошо понял вопрос)

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

Это способ семантического представления последовательностей.

Например, это:

for (i = 1; i <= 5; i++)
{
    document.write("The number is " + i + "<br />"); 
    //(The "<br />" above is an HTML newline, this is in javascript)
}

То же самое, что и это:

document.write("The number is 1" + "<br />");
document.write("The number is 2" + "<br />");
document.write("The number is 3" + "<br />");
document.write("The number is 4" + "<br />");
document.write("The number is 5" + "<br />");

Но первое более ясно о том, что он делает. Также соблюдается принцип DRY (т. Е. Копировать-вставлять код - ужасная практика).

Теперь перейдем к вложенным циклам. Вы должны думать об абстракциях, если хотите быть хорошим программистом, поэтому думайте о цикле for как последовательность операций.
Так что же такое вложенное для цикла? последовательность последовательностей ! :)

Например, это повторяет одно и то же повторение трижды:

for (i = 1; i <= 3; i++)
{
    for (j = 1; j <= 3; j++)
    {
        document.write(j);
    }
    document.write("<br />");
}

И выходы:

123
123
123

Чем больше уровней вложенности будет представлять более сложные последовательности. Как правило, однако, вы не должны вкладывать свой код, если вы не пишете какой-то сложный алгоритм - Один метод должен делать только одну вещь и делать это хорошо .

1 голос
/ 17 ноября 2010

Однажды мои классные сотрудники сказали нам, что любое приложение, которое использует меньше для циклов, является самым эффективным.Это реально?

Конечно, нет.

Однако алгоритм, использующий вложенные циклы , может быть O(n1 * n2 * n3 ...) - что может закончитьсявверх как O(n^c) или хуже (представьте наивный подход, чтобы выяснить, есть ли в одном массиве все элементы, совпадающие с другим массивом, но в любом порядке - O(n^2)).Это не означает, что это , и для спора о том или ином случае потребуется более конкретный случай.В некоторой форме циклы (независимо от того, как они скрыты) являются неотъемлемой частью императивного программирования (даже включая большинство функциональных языков).

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