Rozklad problému na podproblémy



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

Rozklad problému na podproblémy, rekurze

Rozklad problému na podproblémy, rekurze

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

Algoritmizace a programování

Řídicí struktury. alg3 1

Základy algoritmizace 4. Problémy, algoritmy, data

Dekompozice problému, rekurze

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

Část 1 Funkce, lokální proměnné a přidělování paměti. Funkce a procedury. Část 2 Cykly a řízení jejich průchodu. Část 3 Příklady

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Paměť počítače. alg2 1

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

Spojové struktury. Spojová struktura (linked structure):

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

1. Téma 12 - Textové soubory a výjimky

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

KTE / ZPE Informační technologie

3 KTE / ZPE Informační technologie

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

Algoritmizace. Cíle předmětu

Datové struktury. alg12 1

Algoritmizace a programování

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

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

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

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

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

5. Dynamické programování

Algoritmizace. Algoritmizace (Y36ALG), Šumperk - 1. přednáška 1

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

Algoritmizace a programování

9. přednáška - třídy, objekty

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

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

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

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

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

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

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Obsah 10. přednášky: Jak bude probíhat zkouška?! Podrobné informace:

C# konzole Podíl dvou čísel, podmínka IF

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

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

Soubor jako posloupnost bytů

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

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

Rekurzivní algoritmy

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

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

Algoritmizace a programování

Algoritmizace a programování

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

Algoritmizace a programování

ADT Seznam. dynamická množina. prvky vkládáme a vyjímáme na libovolné pozici (místě) v jejich posloupnosti (sekvenci) zásobník a fronta vs.

Řídící struktury, if, while, switch

Implementace LL(1) překladů

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

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

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

Třída jako zdroj funkcí

Spojové struktury. x, y, a, b. X1 y1 X2 y2 X3 y3. Grafické objekty bod. kružnice. obdélník. lomenáčára

Textové soubory. alg9 1

Java a XML. 10/26/09 1/7 Java a XML

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

Řídicí příkazy KAPITOLA 3. Vstup znaků z klávesnice

Úvod do programování 10. hodina

Generování vnitřní reprezentace programu

Základní stavební prvky algoritmu

Java - výjimky. private void vstup() throws IOException {... }

Úvod do programovacích jazyků (Java)

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

Poslední nenulová číslice faktoriálu

Abstraktní datové typy: zásobník

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

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

R zné algoritmy mají r znou složitost

Martin Flusser. November 1, 2016

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Martin Milata, Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od

Generické programování

Dynamické datové struktury III.

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

IB111 Úvod do programování skrze Python

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Regulární výrazy. Vzory

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

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

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

8. přednáška: Soubory a proudy

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

SOUSTAVY LINEÁRNÍCH ALGEBRAICKÝCH ROVNIC

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

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

Dynamické programování

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Transkript:

Rozklad problému na podproblémy Postupný návrh programu rozkladem problému na podproblémy zadaný problém rozložíme na podproblémy pro řešení podproblémů zavedeme abstraktní příkazy s pomocí abstraktních příkazů sestavíme hrubé řešení abstraktní příkazy realizujeme pomocí procedur Rozklad problému na podproblémy ilustrujme na příkladu hry NIM Pravidla: hráč zadá počet zápalek (např. od 15 do 35) pak se střídá se strojem v odebírání; odebrat lze 1, 2 nebo 3 zápalky, prohraje ten, kdo odebere poslední zápalku. Dílčí podproblémy: zadání počtu zápalek odebrání zápalek hráčem odebrání zápalek strojem alg5 1

Hra NIM Hrubé řešení: int pocet; boolean stroj = false; zadání počtu zápalek do { if (stroj) odebrání zápalek strojem else odebrání zápalek hráčem stroj =!stroj; while (pocet>0); if (stroj) vyhrál stroj else vyhrál hráč Podproblémy zadání počtu zápalek, odebrání zápalek strojem a odebrání zápalek hráčem budeme realizovat procedurami, proměnné pocet a stroj pro ně budou nelokálními proměnnými alg5 2

Hra NIM public class Nim { static int pocet; // aktuální počet zápalek static boolean stroj; // =true znamená, že bere počítač public static void main(string[] args) { zadanipoctu(); stroj = false; // zacina hrac do { if (stroj) berestroj(); else berehrac(); stroj =!stroj; while (pocet>0); if (stroj) Sys.pln("vyhrál jsem"); else Sys.pln("vyhrál jste, gratuluji"); static void zadanipoctu() { static void berehrac() { static void berestroj() { alg5 3

Hra NIM static void zadanipoctu() { do { Sys.pln("zadejte počet zápalek (od 15 do 35)"); pocet = Sys.readInt(); while (pocet<15 && pocet>30); static void berehrac() { int x; boolean chyba; do { chyba = false; Sys.pln("počet zápalek "+pocet); Sys.pln("kolik odeberete"); x = Sys.readInt(); if (x<1) { Sys.pln("prilis malo"); chyba = true; else if (x>3 x>pocet) { Sys.pln("prilis mnoho"); chyba = true; while (chyba); pocet -= x; alg5 4

Hra NIM Pravidla pro odebírání zápalek strojem, která vedou k vítězství (je-li to možné): počet zápalek nevýhodných pro protihráče je 1, 5, 9, atd., obecně 4n+1, kde n je celé nezáporné číslo, stroj musí z počtu p zápalek odebrat x zápalek tak, aby platilo p x = 4n + 1 z tohoto vztahu po úpravě a s ohledem na omezení pro x dostaneme x = (p 1) mod 4 vyjde-li x=0, znamená to, že okamžitý počet zápalek je pro stroj nevýhodný a bude-li protihráč postupovat správně, stroj prohraje. static void berestroj() { Sys.pln("počet zápalek "+pocet); int x = (pocet-1) % 4; if (x==0) x = 1; Sys.pln("odebírám "+x); pocet -= x; alg5 5

Rekurzivní algorimus Rekurzivní algoritmus v některém kroku volá sám sebe Rekurzivní procedura (funkce) v některém příkazu volá sama sebe Příklad: nsd(x, y) je-li x = y, pak nsd(x,y) = x je-li x > y, pak nsd(x,y) = nsd(x-y,y) je-li x < y, pak nsd(x,y) = nsd(x,y-x) Rekurzivní funkce: static int nsd(int x, int y) { if (x==y) return x; else if (x>y) return nsd(x-y, y); else return nsd(x, y-x); Jiný příklad faktoriál: n! = 1 pro n 1 n! = n*(n-1)! pro n>1 Rekurzivní funkce: static int fakt(int n) { if (n<=0) return 1; return n*fakt(n-1); alg5 6

Rekurze a rozklad problému na podproblémy Program, který přečte posloupnost čísel zakončenou nulou a vypíše ji obráceně Rozklad problému: zavedeme abstraktní příkaz přečti a obrať posloupnost příkaz rozložíme do tří kroků: přečti číslo if (přečtené číslo není nula) přečti a obrať posloupnost vypiš číslo Řešení: public static void main(string[] args) { obrat(); static void obrat() { int x = Sys.readInt(); if (x!=0) obrat(); Sys.pln(x); alg5 7

Hanojské věže Úkol: přemístit disky na druhou jehlu s použitím třetí pomocné jehly, přičemž musíme dodržovat tato pravidla: - v každém kroku můžeme přemístit pouze jeden disk, a to vždy z jehly na jehlu (disky nelze odkládat mimo jehly), - není možné položit větší disk na menší. Zavedeme abstraktní příkaz přenes_věž(n,a,b,c) který interpretujeme jako "přenes n disků z jehly a na jehlu b s použitím jehly c". Pro n>0 lze příkaz rozložit na tři jednodušší příkazy přenes_věž(n-1,a,c,b) "přenes disk z jehly a na jehlu b", přenes_věž(n-1,c,b,a) alg5 8

Hanojské věže Řešení: package alg5; import sugar.sys; public class Hanoj { public static void main(string[] args) { int pocetdisku = Sys.readInt(); prenesvez(pocetdisku, 1, 2, 3); static void prenesvez(int vyska, int odkud, int kam, int pomoci) { if (vyska>0) { prenesvez(vyska-1, odkud, pomoci, kam); Sys.pln("přenes disk z "+odkud+" na "+kam); prenesvez(vyska-1, pomoci, kam, odkud); alg5 9

Obecně k rekurzivitě Rekurzivní funkce (procedury) jsou přímou realizací rekurzivních algoritmů Rekurzivní algoritmus předepisuje výpočet shora dolů v závislosti na velikosti (složitosti) vstupních dat: pro nejmenší (nejjednodušší) data je výpočet předepsán přímo pro obecná data je výpočet předepsán s využitím téhož algoritmu pro menší (jednodušší) data Výhodou rekurzivních funkcí (procedur) je jednoduchost a přehlednost Nevýhodou může být časová náročnost způsobená např. zbytečným opakováním výpočtu Příklad: Fibonacciho posloupnost: f 0 = 0 f 1 = 1 f i = f i-1 + f i-2 pro i > 1 static int fib(int i) { if (i==0) return 0; if (i==1) return 1; return fib(i-1)+fib(i-2) alg5 10

Od rekurze k iteraci Řadu rekurzívních algoritmů lze nahradit iteračními, které počítají výsledek zdola nahoru, tj, od menších (jednodušších) dat k větším (složitějším) static int fakt(int n) { int f = 1; while (n>1) { f *= n; n--; return f; static int fib(int n) { int i, fn = 0, fp, fpp; if (n>0) { fp = fn; fn = 1; for (i=2; i<n; i++) { fpp = fp; fp = fn; fn = fp + fpp; return fn; Pokud algoritmus výpočtu zdola nahoru nenajdeme (např. při řešení problému Hanojských věží), lze rekurzivitu odstranit pomocí tzv. zásobníku alg5 11