Articles

Základní programování | Řídicí struktury

Smyčky

„Smyčkové příkazy“ nejsou nic jiného než automatizace vícekrokových procesů uspořádáním sekvencí akcí a seskupením částí, které je třeba opakovat. Iterace (neboli smyčky), která je také ústřední součástí programování, dává počítačům velkou část jejich výkonu. Mohou opakovat posloupnost kroků tolikrát, kolikrát je třeba, a vhodným opakováním jednoduchých kroků lze řešit složité problémy.

Obecně existují dva typy „technik smyčkování“:

  1. „For Loops“: jsou takové, které se provádějí předepsaný početkrát, což je řízeno čítačem nebo indexem.
  2. „While Loops“ a „Repeat Loops“: jsou založeny na nástupu a ověření logické podmínky. Podmínka se testuje na začátku nebo na konci konstrukce smyčky.

Podívejme se na ně:

1) Smyčky „For“

V této řídicí struktuře se příkazy provádějí jeden po druhém v postupném pořadí nad posloupností hodnot, která se vyhodnocuje pouze při zahájení smyčky „For“ (nikdy se nevyhodnocuje znovu). V tomto případě je počet iterací pevně stanoven a předem znám.

For Loop

Pokud je výsledkem vyhodnocení podmínky na proměnné (která může nabývat hodnot v rámci zadané posloupnosti) TRUE, provede se postupně jeden nebo více příkazů nad tímto řetězcem hodnot. Jakmile je proveden první test podmínky (s výsledkem TRUE), provede se příkaz a podmínka se vyhodnotí znovu, přičemž proběhne iterační proces. Část „proměnná v posloupnosti“ provede tento test na každé hodnotě posloupnosti, dokud nepokryje poslední prvek.

Pokud není podmínka splněna a výsledek je FALSE (např. část „proměnná v posloupnosti“ dokončila procházení všech prvků posloupnosti), smyčka skončí. Pokud je výsledkem testu podmínky FALSE v první iteraci, smyčka „For Loop“ se nikdy neprovede.

Syntaxe smyčky „For Loops“ je:

Příklad 1

Abychom si ukázali, jak smyčka „For Loops“ funguje, vytvoříme nejprve posloupnost spojením různých názvů ovoce a vytvoříme seznam (nazvaný „fruit_list“):

Tento seznam ovoce použijeme jako „posloupnost“ ve „For Loop“ a „For Loop“ spustí příkaz jednou (vypíše název každé hodnoty) pro každou zadanou hodnotu v posloupnosti (různé ovoce v seznamu ovoce):

Takto je výsledek „For Loop“ následující:

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

OK, takže jsme vypsali název každé hodnoty v seznamu. To není nic zvláštního, že? Dobré je, že pomocí smyčky „For Loop“ lze získat zajímavější výsledky. Podívejte se na následující příklad:

Příklad 2

Co když chceme měnit hodnoty nebo provádět výpočty postupně? Pomocí smyček „For Loops“ můžete provádět matematické operace postupně nad každou hodnotou vektoru (prvky stejného typu, což budou v tomto případě číselné hodnoty).

V tomto příkladu vytvoříme posloupnost čísel (od 1 do 10) a nastavíme smyčku „For Loop“, která vypočítá a vypíše odmocninu z každé hodnoty této posloupnosti:

V tomto případě je výsledkem smyčky „For Loop“:

 1
1.414214
1.732051
2
2.236068
2.449490
2.645751
2.828427
3
3.162278

Můžete použít jakýkoli typ matematického operátoru nad číselnou posloupností, a jak uvidíme později v tomto článku, provádět nejrůznější kombinace mezi různými řídicími strukturami, abyste dosáhli složitějších výsledků.

2) While Loops

V „While Loops“ se nejprve vyhodnotí podmínka, a pokud je výsledek testování této podmínky TRUE, opakovaně se provede jeden nebo více příkazů, dokud se tato podmínka nestane FALSE.

Smyčka „While“

Na rozdíl od příkazů „If“, v nichž se podmínka testovaná jako TRUE provede pouze jednou a skončí, jsou smyčky „While“ iterativními příkazy, které provádějí nějaký výraz znovu a znovu, dokud se podmínka nestane FALSE. Pokud se podmínka nikdy neukáže jako FALSE, bude smyčka „While Loop“ pokračovat donekonečna a program se zhroutí. A naopak, pokud test podmínky na začátku smyčky dopadne FALSE, výraz se nikdy neprovede.

Syntaxe „While Loops“ je:

Příklad 1

Podívejme se na příklad. Nejprve vytvoříme proměnnou (x) a přiřadíme jí hodnotu 1. Pak nastavíme smyčku „While Loop“, která bude iterativně testovat podmínku nad touto proměnnou, dokud test podmínky nedá výsledek FALSE:

Takto to funguje: Počáteční hodnota proměnné (x) je 1, takže když testujeme podmínku „je proměnná (x) menší než 10?“, vyhodnotí se výsledek jako TRUE, výraz se provede a vypíše se výsledek proměnné (x), který je v prvním případě 1. Pak se ale něco stane: proměnná (x) se před ukončením funkce zvýší o 1 a v další iteraci bude hodnota x 2.

Toto přeřazení proměnné je důležité, protože nakonec dojde k podmínce FALSE a ukončení cyklu (hodnota x = 10). Neprovedení změny počátečních podmínek ve smyčce „While“ povede k nekonečné smyčce a pádu programu.

Výstup

 1
2
3
4
5
6
7
8
9

Příklad 2

Slyšeli jste o Fibonacciho posloupnosti? Jedná se o řadu čísel, která má tu vlastnost, že další číslo v posloupnosti se zjistí sečtením dvou čísel před ním: 0, 1, 1, 2, 3, 5, 8, 13, 21,… Tuto posloupnost lze nalézt v několika přírodních jevech a má různé aplikace ve finančnictví, hudbě, architektuře a dalších oborech.

Počítejme ji pomocí smyčky „While Loop“.

V tomto případě nastavíme jako zastavovací podmínku maximální hodnotu v řadě, takže smyčka vypíše Fibonacciho řadu pouze pro čísla menší než 100. V tomto případě se bude Fibonacciho řada počítat jen pro čísla menší než 100, ale pro čísla menší než 100. Jakmile se některý prvek řady (ať už je jakýkoli) stane větším než 100, cyklus smyčky se ukončí.

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

Příklad 3

Jiný způsob generování Fibonacciho řady pomocí „While Loop“ spočívá v tom, že místo nastavení maximální hodnoty řady jako podmínky zastavení nastavíme počet prvků řady, které chceme vygenerovat.

Tato „While Loop“ připojí další prvek řady na konec předchozího prvku, dokud nedosáhne zastavovací podmínky. V tomto případě, jakmile řada dosáhne 10 prvků (bez ohledu na to, o jaké hodnoty se jedná), smyčka cylce skončí.

Výstup

 0 1 1 2 3 5 8 13 21 34

3) Opakovací smyčky

Smyčky „Repeat Loops“ úzce souvisí se smyčkami „While Loops“, „Repeat Loops“ provádějí příkazy iterativně, ale až do splnění podmínky zastavení. Tímto způsobem se příkazy provedou alespoň jednou bez ohledu na to, jaký je výsledek podmínky, a smyčka se ukončí pouze tehdy, když se určitá podmínka stane TRUE:

Repeat Loop

Syntaxe „Repeat Loop“ je následující:

„Opakované smyčky“ používají jako podmínku zastavení příkazy „Break“. „Příkazy Break“ se kombinují s testem podmínky pro přerušení cyklů uvnitř smyček, protože když program narazí na break, předá řízení instrukci, která následuje bezprostředně po konci smyčky (pokud existuje).

„Repeat Loops“ poběží navždy, pokud není splněna podmínka break. Podívejte se na tyto 2 příklady

Příklad 1

Nejprve vytvoříme proměnnou (x) a přiřadíme jí hodnotu 5. Poté se pokusíme vytvořit proměnnou (x). Pak nastavíme „opakovací smyčku“, která iterativně vypíše hodnotu proměnné, změní hodnotu proměnné (zvýší ji o 1) a otestuje podmínku nad touto proměnnou (je-li rovna 10), dokud test podmínky nedá výsledek TRUE.

Podmínka „přerušení“ se spustí, když proměnná (x) dosáhne hodnoty 10, a smyčka skončí.

Výstup

 5
6
7
8
9

Příklad 2

Předpokládejme nyní, že vytváříme seznam náhodných čísel, u kterých neznáme pořadí ani posloupnost generování.

V tomto příkladu použijeme „opakovací smyčku“ pro generování posloupnosti normálně rozdělených náhodných čísel (můžete generovat náhodná čísla s jakýmkoli jiným rozdělením, my si jen vybereme toto) a přerušíme posloupnost, jakmile je jedno z těchto čísel větší než 1. V tomto příkladu budeme generovat náhodná čísla s normálním rozdělením. Protože nevíme, která čísla přijdou jako první, nevíme, jak dlouhá bude posloupnost: známe pouze podmínku přerušení.

Nejprve použijeme instrukci „set.seed“, abychom zafixovali náhodná čísla (generovali vždy stejná náhodná čísla) a zajistili reprodukovatelnost tohoto příkladu.

Poté zahájíme „opakovací smyčku“ tak, že vygenerujeme normálně rozložené náhodné číslo, vypíšeme ho a zkontrolujeme, zda je toto číslo větší než 1. Teprve když se tato podmínka stane PRAVDIVOU (může být s prvním vygenerovaným číslem, nebo také ne), cyklus smyčky přejde k příkazu break a skončí.

Výstup

 -0.9619334
-0.2925257
0.2587882
-1.152132
0.1957828
0.03012394
0.08541773
1.11661

Tady se opět ukazuje, jak je důležité nastavit správnou podmínku přerušení. Pokud tak neučiníte, dojde k nekonečnému cyklu.

Závěrečné myšlenky

Viděli jsme a vysvětlili pojmy izolovaně, ale „řídicí struktury“ lze libovolně kombinovat: Smyčky mohou obsahovat několik vnitřních smyček; podmínky mohou obsahovat smyčky a podmínky, možnosti jsou nekonečné. (ve skutečnosti jsme při prohlížení „Opakovaných smyček“ zjistili, že příklady obsahují vnořené příkazy „If“).

Můžete vyvinout pokročilá řešení pouhou kombinací „Řídicích struktur“, které jsme vysvětlili v tomto článku. Jak uvedl Minsky, složitých výsledků můžeme dosáhnout v důsledku interakce jednodušších komponent. Řídicí struktury představují základní bloky pro rozhodovací procesy ve výpočetní technice. Mění tok programů a umožňují nám z jednodušších stavebních kamenů sestavovat složité sady instrukcí.

Moje rada zní: naučte se o nich.

Ulehčí vám to cestu ke kódování a porozumění programům a pomůže vám to najít nové způsoby řešení problémů.