2010-11-16 8 views
1

Я был студентом компьютерных наук. Но я не очень кодировал. Для петель довольно просто для меня, и если он был вложен в цикл, моя голова начинает вращаться.Вложенные петли?

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

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

Предложите мне 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 для циклов (вложенных), firts две итерации идут гладко. После этого, если я добавлю какие-либо другие вычисления во внутренний цикл, через секунду все его уйдет. Я не могу продолжать. Итак, тогда мне нужно запустить цикл на ПК как меньший, а затем я построю его на полностью функциональный.

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

+0

Функциональное программирование и для петель? Это странное сочетание тегов. Даже более странно, что вы не упоминаете функционального программирования вообще. –

+0

Если вы понимаете' for' петли, то вложенные циклы не должны быть особенно большой скачок. Вы можете думать о них как о средстве для итерации над двумерным (или * n * -мерным, вообще) пространством. –

+0

@ Oli Charlesworth: Ya, 2, ... n мерно пугает меня Я видел парня, который мгновенно вычисляет 3 вложенных для цикла операций. Он должен хорошо практиковаться. Как я могу пойти на его уровень? – 2010-11-16 22:34:54

ответ

5

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

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

Если у вас есть 2D-массив, и вам нужно достичь всех индексов, вы можете использовать 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 (перед вложенным циклом) и X2 - вторая часть (после вложенного цикла цикла), порядок выполнения:

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

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

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

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

+1

+1 за усилие, но я не думаю, что вам было легче понять. :) – deceze

+0

@ unlephant: Nice Spot. CodingBat ... спасибо – 2010-11-17 09:08:16

1

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

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

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

1

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

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

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

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

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 principle (т. Е. Это ужасная практика для копирования-вставки кода).

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

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

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

и выходы:

123 
123 
123 

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

+0

Такое же имя переменной в обоих циклах? Смущает в лучшем случае. –

+0

Извините, исправлено. :) –

1

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

Пуск с один случай. Код в этом случае с литералами.

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

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

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

"

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