Articles

Essential Programming | Control Structures

Loops

„Loop statements” to nic innego jak automatyzacja procesów wieloetapowych poprzez organizowanie sekwencji działań i grupowanie części, które muszą być powtarzane. Również centralna część programowania, iteracja (lub Looping) daje komputerom wiele z ich mocy. Mogą one powtarzać sekwencję kroków tak często, jak to konieczne, a odpowiednie powtórzenia prostych kroków mogą rozwiązywać złożone problemy.

Ogólnie rzecz biorąc, istnieją dwa rodzaje „technik zapętlania”:

  1. „Pętle For”: to takie, które wykonują się przez określoną liczbę razy, kontrolowaną przez licznik lub indeks.
  2. „Pętle While” i „Pętle Repeat”: opierają się na rozpoczęciu i weryfikacji warunku logicznego. Warunek jest testowany na początku lub na końcu konstrukcji pętli.

Przyjrzyjrzyjmy się im:

1) Pętle For

W tej strukturze sterowania, instrukcje są wykonywane jedna po drugiej w kolejności nad sekwencją wartości, która jest oceniana tylko wtedy, gdy „Pętla For” jest zainicjowana (nigdy nie jest ponownie oceniana). W tym przypadku, liczba iteracji jest stała i znana z góry.

Pętla For

Jeżeli ocena warunku na zmiennej (która może przyjmować wartości w ramach określonej sekwencji) daje wynik TRUE, jedno lub więcej poleceń zostanie wykonanych sekwencyjnie nad tym ciągiem wartości. Po wykonaniu pierwszego testu warunku (i uzyskaniu wyniku TRUE), instrukcja jest wykonywana i warunek jest oceniany ponownie, przechodząc przez proces iteracyjny. Sekcja „zmienna w sekwencji” wykonuje ten test na każdej wartości sekwencji, aż obejmie ostatni element.

Jeśli warunek nie jest spełniony i wynik jest FALSE (np. część „zmienna w sekwencji” zakończyła przechodzenie przez wszystkie elementy sekwencji), pętla kończy się. Jeżeli test warunku da wynik FALSE w pierwszej iteracji, to pętla „For Loop” nigdy nie zostanie wykonana.

Składnia pętli „For Loops” jest następująca:

Przykład 1

Aby pokazać, jak działają pętle „For Loops”, najpierw utworzymy sekwencję, łącząc różne nazwy owoców, aby utworzyć listę (zwaną „fruit_list”):

Użyjemy tej listy owoców jako „sekwencji” w pętli „For Loop”, i sprawimy, że pętla „For Loop” uruchomi instrukcję raz (wydrukuje nazwę każdej wartości) dla każdej dostarczonej wartości w sekwencji (różnych owoców z listy owoców):

W ten sposób, wynik „Pętli For” jest następujący:

## "Apple"
## "Kiwi"
## "Orange"
## "Banana"

OK, więc wydrukowaliśmy nazwę każdej wartości na liście. Nic wielkiego, prawda? Dobrą rzeczą jest to, że „Pętle For” mogą być użyte do uzyskania bardziej interesujących wyników. Spójrz na poniższy przykład.

Przykład 2

A co jeśli chcemy modyfikować wartości lub wykonywać obliczenia sekwencyjnie? Możesz użyć pętli „For Loops”, aby wykonać operacje matematyczne sekwencyjnie nad każdą wartością wektora (elementy tego samego typu, które w tym przypadku będą liczbowe).

W tym przykładzie utworzymy sekwencję liczb (od 1 do 10) i ustawimy pętlę „For Loop”, aby obliczyć i wydrukować pierwiastek kwadratowy każdej wartości w tej sekwencji:

W tym przypadku wynikiem pętli „For Loop” jest:

 1
1.414214
1.732051
2
2.236068
2.449490
2.645751
2.828427
3
3.162278

Możesz użyć dowolnego typu operatora matematycznego nad ciągiem liczbowym, i jak zobaczymy w dalszej części artykułu, dokonywać wszelkiego rodzaju kombinacji pomiędzy różnymi Strukturami Sterowania, aby osiągnąć bardziej złożone wyniki.

2) While Loops

W „While Loops” warunek jest najpierw oceniany, i jeśli wynik testowania tego warunku jest TRUE, jedno lub więcej poleceń jest wielokrotnie wykonywane, aż warunek stanie się FALSE.

Pętla „While”

W przeciwieństwie do instrukcji „If”, w których warunek testowany jako TRUE wykonuje wyrażenie tylko raz i kończy się, pętle „While” są iteracyjnymi instrukcjami, które wykonują pewne wyrażenie w kółko, aż warunek stanie się FALSE. Jeśli warunek nigdy nie okaże się FAŁSZYWY, „While Loop” będzie trwać wiecznie i program się zawiesi. W drugą stronę, jeśli test warunku da wynik FAŁSZ na początku pętli, wyrażenie nigdy nie zostanie wykonane.

Składnia pętli „While Loops” jest następująca:

Przykład 1

Zobaczmy przykład. Najpierw utworzymy zmienną (x) i przypiszemy jej wartość 1. Następnie ustawimy pętlę „While Loop”, aby iteracyjnie testować warunek nad tą zmienną, aż do uzyskania wyniku FALSE:

Tak to działa: początkowa wartość zmiennej (x) wynosi 1, więc kiedy testujemy warunek „czy zmienna (x) jest mniejsza niż 10?”Ale potem coś się dzieje: zmienna (x) jest zwiększana o 1 przed zakończeniem funkcji i w następnej iteracji wartość x będzie wynosić 2.

Ta zmiana przypisania zmiennej jest ważna, ponieważ w końcu dojdzie do warunku FALSE i wyjścia z pętli (wartość x = 10). Niezmienienie warunków początkowych w pętli „While Loop” spowoduje nieskończoną pętlę i awarię programu.

Wyjście

 1
2
3
4
5
6
7
8
9

Przykład 2

Czy słyszałeś o ciągu Fibonacciego? Jest to ciąg liczb, który charakteryzuje się tym, że następna liczba w ciągu jest znajdowana przez dodanie dwóch liczb przed nią: 0, 1, 1, 2, 3, 5, 8, 13, 21,… Ciąg ten można znaleźć w kilku zjawiskach przyrody i ma różne zastosowania w finansach, muzyce, architekturze i innych dziedzinach.

Obliczmy go używając pętli „While Loop”.

W tym przypadku ustawiamy maksymalną wartość w szeregu jako warunek zatrzymania, tak że pętla wypisuje szereg Fibonacciego tylko dla liczb poniżej 100. Kiedy element serii (kiedykolwiek jest) staje się większy niż 100, cykl pętli kończy się.

 0
1
1
2
3
5
8
13
21
34
55
89

Przykład 3

Innym sposobem generowania serii Fibonacciego za pomocą pętli „While Loop” jest, zamiast ustawiania maksymalnej wartości serii jako warunku zatrzymania, ustawienie liczby elementów serii, które chcesz wygenerować.

Ta „Pętla While” dołącza następny element serii do końca poprzedniego elementu, aż do osiągnięcia warunku zatrzymania. W tym przypadku, gdy seria osiągnie 10 elementów (bez względu na wartości), pętla się kończy.

Wyjście

 0 1 1 2 3 5 8 13 21 34

3) Pętle powtórzeniowe

Pętle powtórzeniowe, ściśle powiązane z pętlami „While Loops”, wykonują polecenia iteracyjnie, ale do momentu spełnienia warunku zatrzymania. W ten sposób instrukcje są wykonywane co najmniej raz, niezależnie od wyniku warunku, a pętla jest zamykana tylko wtedy, gdy pewien warunek stanie się TRUE:

Pętla powtórzona

Składnia „pętli powtórzonej” to:

„Powtarzające się pętle” używają „Break statements” jako warunku zatrzymania. „Break statements” są połączone z testem warunku, aby przerwać cykle wewnątrz pętli, ponieważ gdy program trafi na break, przekaże sterowanie do instrukcji bezpośrednio po zakończeniu pętli (jeśli istnieje).

„Repeat Loops” będą działać bez końca, jeśli warunek break nie zostanie spełniony. Zobacz te 2 przykłady

Przykład 1

Najpierw tworzymy zmienną (x) i przypisujemy jej wartość 5. Następnie ustawiamy pętlę „Repeat Loop”, aby iteracyjnie drukowała wartość zmiennej, modyfikowała wartość zmiennej (zwiększała ją o 1) i testowała warunek na tej zmiennej (czy jest równa 10), dopóki test warunku nie da wyniku TRUE.

„Warunek zrywający” wyzwala się, gdy zmienna (x) osiągnie wartość 10 i pętla się kończy.

Wyjście

 5
6
7
8
9

Przykład 2

Załóżmy teraz, że produkujemy listę liczb losowych, dla których nie znamy kolejności lub sekwencji generowania.

W tym przykładzie użyjemy „Powtarzającej się Pętli” do wygenerowania sekwencji normalnie rozłożonych liczb losowych (możesz wygenerować losowe z dowolnym innym rozkładem, my po prostu wybieramy ten), i przerwać sekwencję, gdy jedna z tych liczb jest większa niż 1. Ponieważ nie wiemy, które liczby będą pierwsze, nie wiemy też jak długa będzie sekwencja: znamy tylko warunek przerwania.

Po pierwsze, używamy instrukcji „set.seed” do ustalenia liczb losowych (generowania zawsze tych samych liczb losowych) i uczynienia tego przykładu powtarzalnym.

Następnie inicjujemy „Powtarzającą się pętlę” poprzez wygenerowanie normalnie rozłożonej liczby losowej, wypisanie jej i sprawdzenie, czy ta liczba jest większa od 1. Tylko wtedy, gdy ten warunek stanie się TRUE (może być z pierwszą wygenerowaną liczbą, lub nie), cykl pętli przejdzie do instrukcji break i zakończy się.

Wyjście

 -0.9619334
-0.2925257
0.2587882
-1.152132
0.1957828
0.03012394
0.08541773
1.11661

Po raz kolejny pokazuje to, jak ważne jest ustawienie odpowiedniego warunku przerwania. Niewykonanie tego spowoduje nieskończoną pętlę.

Pomysły końcowe

Widzieliśmy i wyjaśniliśmy koncepcje w izolacji, ale „Struktury kontrolne” mogą być łączone w dowolny sposób: Pętle mogą zawierać kilka wewnętrznych Pętli; Warunkowe mogą zawierać Pętle i Warunkowe, opcje są nieskończone. (w rzeczywistości, podczas przeglądania „Powtarzających się pętli” odkryliśmy, że przykłady zawierały zagnieżdżone „instrukcje If”).

Możesz rozwijać zaawansowane rozwiązania po prostu łącząc „Struktury kontrolne”, które wyjaśniliśmy w tym artykule. Jak Minsky stwierdził, możemy osiągnąć złożone wyniki w wyniku interakcji prostszych elementów. Struktury Sterowania stanowią podstawowe bloki dla procesów decyzyjnych w informatyce. Zmieniają one przepływ programów i umożliwiają nam konstruowanie złożonych zestawów instrukcji z prostszych bloków.

Moja rada brzmi: poznaj je.

Ułatwi ci to drogę do kodowania i zrozumienia programów oraz pomoże znaleźć nowe sposoby rozwiązywania problemów.

.