Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Podobné dokumenty
4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Spojová implementace lineárních datových struktur

Rekurzivní algoritmy

Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

5. přednáška - Rozklad problému na podproblémy

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Binární vyhledávací stromy II

Rozklad problému na podproblémy

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Vyhledávání v textu. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Struktura programu v době běhu

Rekurze. Jan Hnilica Počítačové modelování 12

Rozklad problému na podproblémy, rekurze

5. Dynamické programování

Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III

Rozklad problému na podproblémy, rekurze

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Hašování. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

VYŠŠÍ ODBORNÁ ŠKOLA a STŘEDNÍ PRŮMYSLOVÁ ŠKOLA Mariánská 1100, Varnsdorf PROGRAMOVÁNÍ FUNKCE, REKURZE, CYKLY

Programování v C++ 1, 1. cvičení

Úvod do programování 10. hodina

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Poslední nenulová číslice faktoriálu

Stromy, haldy, prioritní fronty

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Funkce, intuitivní chápání složitosti

Základní datové struktury III: Stromy, haldy

Přednáška 3. Rekurze 1

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Paralelní a distribuované výpočty (B4B36PDV)

Prohledávání do šířky = algoritmus vlny

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Techniky návrhu algoritmů

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Úvod do programování - Java. Cvičení č.4

Rekurze. IB111 Úvod do programování skrze Python

Dynamické datové struktury III.

Logo2 operace, rekurze, větvení výpočtu

Dynamické programování

Dekompozice problému, rekurze

dovolují dělení velkých úloh na menší = dekompozice

5 Rekurze a zásobník. Rekurzivní volání metody

Programování v C++ 1, 14. cvičení

Více o konstruktorech a destruktorech

Tato tematika je zpracována v Záznamy přednášek: str

Časová a prostorová složitost algoritmů

Úvod do programovacích jazyků (Java)

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

Základy programování (IZP)

KTE / ZPE Informační technologie

Implementace LL(1) překladů

Martin Flusser. November 1, 2016

Rozsáhlé programy = projekty

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

Základy programování (IZP)

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Základní datové struktury

Úvod do informatiky. Miroslav Kolařík

Rekurze a rychlé třídění

NPRG030 Programování I, 2015/16 1 / :25:32

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Iterační výpočty Projekt č. 2

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Binární soubory (datové, typované)

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Algoritmizace a programování

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Základy algoritmizace a programování

2 Strukturované datové typy Pole Záznam Množina... 4

Základy programování (IZP)

Výčtový typ strana 67

Téma 8: Optimalizační techniky v metodě POPV

Funkce a procedury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 5 A0B36PR1 Programování 1

Kombinatorika, výpočty

Numerické algoritmy KAPITOLA 11. Vyhledávání nulových bodů funkcí

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

Principy indukce a rekursivní algoritmy

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Definice funkcí a procedur. Mnoho operací provozujeme opakovaně, proto je hloupé programovat je při každém použití znovu.

Zobrazování 2D Nadpis křivek 2 Nadpis 3

NPRG030 Programování I, 2018/19 1 / :03:07

Hledání k-tého nejmenšího prvku

Úvod do programovacích jazyků (Java)

Základní stavební prvky algoritmu

8 Třídy, objekty, metody, předávání argumentů metod

Transkript:

Rekurze doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Rekurze 161 / 344

Osnova přednášky Rekurze Co si představit pod pojmem rekurze? Faktoriál Fibonacciho posloupnost Jiří Dvorský (VŠB TUO) Rekurze 162 / 344

Rekurze Co si představit pod pojmem rekurze? 1. seber všechny hračky!, 2. soběpodobnost, fraktály, 3. z hlediska algoritmů, je to algoritmus, který v určitém okamžiku výpočtu volá sám sebe, 4. rozklad na menší podproblémy, princip rozděl a panuj, (divide et impera), 5. dělení končí u atomického problému řešení je známo například z definice, 6. rekurze je jistým způsobem ekvivalentní iteraci (cyklu). Jiří Dvorský (VŠB TUO) Rekurze 163 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 164 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 165 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 166 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 167 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 168 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 169 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 170 / 344

Ukázka rekurze graficky Jiří Dvorský (VŠB TUO) Rekurze 171 / 344

Funkce vykreslující ukázkový fraktál void Draw(const int Level, const double CenterX, const double CenterY, const double A) { if (Level > MaxLevel) return; double A2 = A / 2; Draw(Level + 1, CenterX - A2, CenterY - A2, A2); Draw(Level + 1, CenterX + A2, CenterY - A2, A2); Draw(Level + 1, CenterX + A2, CenterY + A2, A2); Draw(Level + 1, CenterX - A2, CenterY + A2, A2); DrawSquare(CenterX - A2, CenterY - A2, A); } Ukázka volání Draw(0, 0, 0, 50); Jiří Dvorský (VŠB TUO) Rekurze 172 / 344

Některé pojmy přímá rekurze funkce volá sama sebe. nepřímá rekurze funkce A volá funkci B a ta opět volá funkce A. ukončovací podmínka jistá část řešení problému je atomická, řešení je známo např. z definice problému. Jiří Dvorský (VŠB TUO) Rekurze 173 / 344

Faktoriál Princip rekurze si ukážeme na výpočtu faktoriálu čísla n. Funkce faktoriál je definována jako { 1 pro n = 0 n! = n * (n 1)! pro n 1 Pokud funkci faktoriál místo n! označíme jako f (n) můžeme faktoriál zapsat jako { 1 pro n = 0 f (n) = n * f (n 1) pro n 1 Což vede ke známému vyjádření n! = n *(n 1)! = n *(n 1)(n 2)! = = n *(n 1)*(n 2)* *1*0! Jiří Dvorský (VŠB TUO) Rekurze 174 / 344

Výpočet hodnot funkce faktoriál Vstupní Výpočet Hodnota hodnota hodnoty faktoriálu 0 podle definice 1 1 1 * 1 1 2 2 * 1 2 3 3 * 2 6 4 4 * 6 24 5 5 * 24 120 6 6 * 120 720 7 7 * 720 5 040 8 8 * 5 040 40 320 9 9 * 40 320 362 880 10 10 * 362 880 3 628 800 Jiří Dvorský (VŠB TUO) Rekurze 175 / 344

Faktoriál ukázka kódu int factorial(const int n) { if(n == 0) return 1; return n * factorial(n - 1); } Jiří Dvorský (VŠB TUO) Rekurze 176 / 344

Faktoriál výpočet Co se děje při rekurzívním výpočtu? Jak je zajištěno, aby se uchovaly všechny hodnoty proměnných v okamžiku rekurentního volání dílčí úlohy a při jejím ukončení, tj.návratu z poslední rekurentní funkce či procedury byly předány správné hodnoty? jednotlivé úlohy seřadíme do řady, aktuální úloha je na konci v okamžiku dokončení výpočtu, je výsledek předán volající metodě, ruší se lokální proměnné je to zásobník, LIFO každým rekurzivním voláním metody vzniká nová množina všech parametrů a lokálních proměnných mají sice stejné identifikátory jako při prvním volání, ale jejich hodnoty jsou jiné Jiří Dvorský (VŠB TUO) Rekurze 177 / 344

Faktoriál schéma rekurze Požadavek na výpočet 4! Prvnívolánín=4 Druhévolánín=3 Třetívolánín=2 Čtvrtévolánín=1 Pátévolánín=0 Návrat přímo shodnotou1 Násobeno 1 Návrat s hodnotou 1 Násobeno 2 Návrat s hodnotou 2 Násobeno 3 Návrat s hodnotou 6 Násobeno 4 Návrat s hodnotou 24 Ukončení s hodnotou 24 Obrázek 3.2: Princip vnořování rekurze Jiří Dvorský (VŠB TUO) Rekurze 178 / 344

Fibonacciho posloupnost aneb Kolik potomků párů králíků bude mít po roce jeden původní králičí pár? 1. Na pole vypustíme pár králíků. 2. Králíci dospívají po jednom měsíci, březost trvá jeden měsíc. To znamená, že po dvou měsících samice vyprodukuje nový pár králíků. 3. Králíci neumírají a nejsou nemocní. 4. Každý pár králíků vždy vyprodukuje jeden nový pár samec/samice. Úloha byla poprvé publikována roku 1202 Leonardem Pisano (Leonardo Fibonacci) v knize Liber Abacci Jiří Dvorský (VŠB TUO) Rekurze 179 / 344

Fibonacciho posloupnost Řešení: 1. Po prvním měsíci bude na poli stále jeden pár králíků. Na poli je 1 pár. 2. Na konci druhého měsíce vznikne jeden nový pár králíků. Na poli jsou 2 páry. 3. Na konci třetího měsíce původní pár vyprodukuje nový pár, druhý pár dospívá. Na poli jsou 3 páry. 4. Na konci čtvrtého měsíce, původní pár vyprodukoval další pár, pár narozený před dvěma měsíci má svoje první potomstvo. Na poli je 5 párů. Na konci n-tého měsíce je počet párů králíků roven počtu nových párů králíků (což je počet párů v měsíci n-2) plus počet párů žijících v minulém měsíci. Jiří Dvorský (VŠB TUO) Rekurze 180 / 344

Fibonacciho posloupnost Matematické vyjádření: 0 pro n = 0 F (n) = 1 pro n = 1 F (n 1) + F (n 2) pro n > 1 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,... F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 4 = 3, F 5 = 5, F 6 = 8, F 7 = 13,... Jiří Dvorský (VŠB TUO) Rekurze 181 / 344

Fibonacciho posloupnost ukázka kódu int F(const int n) { if (n == 0) return 0; if (n == 1) return 1; return F(n - 1) + F(n - 2); } Jiří Dvorský (VŠB TUO) Rekurze 182 / 344

Fibonacciho posloupnost ukázka výpočtu 3 2 2 1 1 0 1 n = 2 n = 3 0 Jiří Dvorský (VŠB TUO) Rekurze 183 / 344

Fibonacciho posloupnost ukázka výpočtu 4 3 2 2 1 1 0 1 0 n = 4 Jiří Dvorský (VŠB TUO) Rekurze 184 / 344

Fibonacciho posloupnost ukázka výpočtu 5 4 3 3 2 2 1 2 1 1 0 1 0 1 0 n = 5 Jiří Dvorský (VŠB TUO) Rekurze 185 / 344

Vyhledání maxima hodnot v poli iterativně int maximumiter(int[] a, const int N) { int max = a[0]; for(int i = 0; i < N; i++) { if (a[i] > max) max = a[i]; } return max; } Jiří Dvorský (VŠB TUO) Rekurze 186 / 344

Vyhledání maxima hodnot v poli rekurzivně int maxrecursive(int[] a, const int left, const int right) { if (left == right) return a[left]; int m = (left + right) / 2; int lm = maxrecursive(a, left, m); int rm = maxrecursive(a, m+1, right); return lm > rm? lm : rm; } Jiří Dvorský (VŠB TUO) Rekurze 187 / 344

Rekurze shrnutí užitečná technika jak psát programy, založena na rozdělení problému na menší podproblémy, z vyřešených dílčích částí skládá celek, spíše deklarujeme co chceme řešit, než jak to máme řešit, používána pro vyhledávání řešení. Jiří Dvorský (VŠB TUO) Rekurze 188 / 344

Děkuji za pozornost Jiří Dvorský (VŠB TUO) Rekurze 189 / 344