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

Podobné dokumenty
5. Dynamické programování

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

Struktura programu v době běhu

Rozklad problému na podproblémy, rekurze

Rekurzivní algoritmy

Úvod do programování 10. hodina

Rozklad problému na podproblémy

Rozklad problému na podproblémy, rekurze

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

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

BI-EP1 Efektivní programování 1

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

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

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

Dekompozice problému, rekurze

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

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

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

Více o konstruktorech a destruktorech

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

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

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

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

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

Programovací jazyk Haskell

Programovací í jazyk Haskell

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

Lineární spojový seznam (úvod do dynamických datových struktur)

Úvod do informatiky. Miroslav Kolařík

Mělká a hluboká kopie

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.

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

Časová a prostorová složitost algoritmů

1. Úvodní informace. BI-EP1 Efektivní programování Martin Kačer

Programování v jazyce JavaScript

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.

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

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

DYNAMICKÉ PROGRAMOVÁNÍ A PROBLÉM BATOHU

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Základní datové struktury

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Rekurze. Princip a použití rekurze. Převod rekurze na iteraci.

6. Základy výpočetní geometrie

Databáze, sítě a techniky programování X33DSP

Dynamické programování

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

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

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

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

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

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

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

Martin Flusser. November 1, 2016

2. Mřížky / Záplavové vyplňování

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Programování v jazyce JavaScript

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Stromy, haldy, prioritní fronty

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

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.

Algoritmy a datové struktury

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

BI-EP2 Efektivní programování 2

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

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

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Úvod do programování. Lekce 5

prohled av an ı graf u Karel Hor ak, Petr Ryˇsav y 16. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Abstraktní třídy, polymorfní struktury

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Obsah Techniky návrhu algoritmů Rekurze, algoritmy prohledávání s návratem, dynamické programování Rekurze... 5

Přednáška 3. Rekurze 1

Úvod do programovacích jazyků (Java)

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Jednoznačné a nejednoznačné gramatiky

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

Abstraktní datové typy

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. Programování proti rozhraní

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Funkce, procedury, složitost

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Programování v jazyce JavaScript

Abstraktní datové typy: zásobník

PROHLEDÁVÁNÍ GRAFŮ. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Operační systémy. Cvičení 4: Programování v C pod Unixem

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

Algoritmy výpočetní geometrie

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

Pointery II. Jan Hnilica Počítačové modelování 17

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

KTE / ZPE Informační technologie

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

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

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Lineární datové struktury

Transkript:

4. Rekurze BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Rekurze co je to? Funkce (metoda) během svého vykonávání způsobí své nové vyvolání Přímo Nepřímo (přes jinou funkci/metodu) Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 2

Rekurze proč? Programovací technika V některých jazycích v podstatě jediná možnost pro vyjádření opakování atp. Je stejně silná jako iterace (cykly) Způsob uvažování o problému Může zjednodušit řešení Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 3

Rekurze kdy? Rekurzivní povaha problému Hierarchické datové struktury Rekurentní definice Rekurzivní přístup k řešení Převod na jednodušší instanci Rozdělení na více menších podproblémů Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 4

Rekurzivní pohled Instance problému (konkrétní zadání) K řešení použijeme řešení menší instance Jedné (lineární rekurze) Více (stromová rekurze) Nejjednodušší instanci vyřešíme Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 5

Příklad faktoriál N! = 1. 2. 3. 4.. (N-1). N Menší instance (N-1)! Krok řešení N! = (N-1)!. N Základní případ (ukončující podmínka) 0! = 1 Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 6

Faktoriál kód Ukončující podmínka Rekurzivní krok int factorial(int n) { if (n < 1) return 1; return n * factorial(n-1); } Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 7

Příklad Fibonacciho čísla 1, 1, 2, 3, 5, 8, 13, 21, 34, F(1) = F(2) = 1 pro N>2: F(N) = F(N-2) + F(N-1) Rekurzivní řešení se nabízí Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 8

Fibonacciho čísla kód F(1) = F(2) = 1 pro N>2: F(N) = F(N-2) + F(N-1) int fib(int n) { if (n <= 2) return 1; return fib(n-2) + fib(n-1); } Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 9

Strom rekurzivního volání fib(6) fib(4) fib(5) fib(2) fib(3) fib(3) fib(4) fib(1) fib(2) fib(1) fib(2) fib(2) fib(3) fib(1) fib(2) Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 10

Princip volání funkcí Lokální proměnné systémový zásobník Při volání funkce uložení na zásobník Registry Návratová adresa Parametry funkce Při návratu Odstranění ze zásobníku Předání výsledku Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 11

Rekurze funguje stejně Rekurze při vykonávání nic nového Vykonává se stále stejná funkce Stav uložen na zásobníku: Parametry Proměnné Návratové adresy Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 12

Rekurze demo int main() { printf( %d\n, A fib(5)); } int fib(int n) { int x; if (n<=2) return 1; B x = fib(n-2); x += C fib(n-1); return x; } ret A main ret x parametry proměnné Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 13

Rekurze demo int main() { printf( %d\n, A fib(5)); } int fib(int n) { int x; if (n<=2) return 1; B x = fib(n-2); x += C fib(n-1); return x; } ret B fib n = 5 x ret A main ret x parametry proměnné Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 14

Příklad hanojské věže Přesouvání disků mezi třemi trny Po jednom a pouze menší na větší Úkol: přenést z A na B A B C Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 15

Hanojské věže jak na to? Rekurzivně N-1 disků z A na C (největší disk nevadí) největší z A na B N-1 disků z C na B A B C Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 16

Hanojské věže kód Ukončovací podmínka? Co nejjednodušší => žádný disk! void hanoi(int n, int from, int to, int use) { if (!n) return; hanoi(n-1, from, use, to); move_one(n, from, to); hanoi(n-1, use, to, from); } Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 17

Jak vidět rekurzi? Kdyby byla instance problému o maličko menší, uměl bych řešení rozšířit Voláme funkci, aby menší instanci vyřešila (jako když voláme standardní funkci) Je lepší si příliš nepředstavovat úrovně zanoření a zásobník (ale měli bychom znát) Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 18

Kopírování seznamu do pole Na vstupu spojový seznam Výsledkem pole se stejnými prvky 3 6 4 8 5 2 X 3 6 4 8 5 2 Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 19

Kopírování seznamu do pole Standardní řešení má 2 průchody: 1. Určení počtu prvků 2. Kopírování Rekurze: Při zanořování počítá prvky Při návratu kopíruje Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 20

Seznam rekurzivní krok Zkopírujeme zbytek seznamu do dostatečně velkého pole Na první pozici přidáme první prvek Potřebujeme přidat parametr Kolik prvků na začátku vynechat Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 21

Seznam kód Ukončovací podmínka = prázdný seznam Šlo by to bez rekurze napsat kratší? int[] copylist(node head) { return copyrest(0, head); } int[] copyrest(int n, Node head) { if (head == null) return new int[n]; int[] res = copyrest(n+1, head.next); res[n] = head.number; return res; } Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 22

Rekurze na co dát pozor Ukončovací podmínka MUSÍ být vždy přítomna Místo na systémovém zásobníku Je omezené, musíme s tím počítat Časová složitost! Někdy nesnadné určit Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 23

Rekurze operační složitost Lineární O(h) Kaskádní (k volání) O(k h ) Podrobněji viz BI-EFA Martin Kačer, BI-EP1, ZS 2011 4. Rekurze 24