Alg51 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ů.

Slides:



Advertisements
Podobné prezentace
UPPAAL příklady Jiří Vyskočil 2010.
Advertisements

Funkce Připomeňme si program pro výpočet faktoriálu:
Příkazy Přednáška č. 4. Příkazy (statements)  Příkaz – dílčí krok programu (část kódu – zpravidla jeden řádek)  Program – posloupnost příkazů  Příkazy.
10. Dynamické datové struktury
Spojové struktury Spojová struktura ( linked structure ):
Programování numerických výpočtů - návrh písemky.
PA081 Programování numerických výpočtů
Metody (funkce, procedury)
Třídění Seminář IVT. Definice uspořádání skupiny dat (záznamů) dle daného klíče vzestupně (od nejmenší do největší hodnoty klíče) sestupně (od největší.
Počítače a programování 1. Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek.
Algoritmy I Cvičení č. 3.
Algoritmizace Cíl předmětu - naučit se sestavovat algorimy řešení základních problémů a zapisovat je v jazyku Java. Jádrem předmětu jsou data, typy, výrazy.
Medians and Order Statistics Nechť A je množina obsahující n různých prvků: Definice: Statistika i-tého řádu je i-tý nejmenší prvek, tj., minimum = statistika.
Větvení cykly J a v a Začínáme programovat Lucie Žoltá.
J a v a Začínáme programovat Lucie Žoltá Přetěžování metod, rekurze.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
Jazyk vývojových diagramů
KIV/PRO Cvičení Nalezení maxima Nalezněte (co nejefektivněji) maximum v následující posloupnosti: – 2; 12; 8; 39; 9; 4; 3; 20; 28; 19;
Informatika I 2. přednáška
Třída jako zdroj funkcionality
C# - funkce a procedury Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
Algoritmizace a programování Třídící algoritmy - 12
Časová složitost algoritmů
Ukázka odstranění rekurze Přemysl Tišer
Alg91 Textové soubory Na rozdíl od jiných typů souborů jsou textové soubory určené pro gramotné lidské oko. Textový soubor je posloupnost znaků členěná.
Počítače a programování 1
5. Procedury a funkce Procedura je samostatně odladěný algoritmus, v programu může být volána vícekrát. Dvojí terminologie - rozlišujeme procedury a funkce.
Informatika I 7. přednáška RNDr. Jiří Dvořák, CSc.
Informatika I 8. přednáška RNDr. Jiří Dvořák, CSc.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
2 CYKLUS S PEVNÝM POČTEM OPAKOVÁNÍ Podle řídící proměnné proveď n-krát příkaz P1.
ZADÁNÍ Sestavte program, který vypočítá obvod a obsah čtverce o straně a. Zajistěte, aby výpočet byl realizován pouze v případě, kdy strana a bude mít.
Hlášky Hlášky v JavaScriptu jsou trojího typu: Hlášky v JavaScriptu jsou trojího typu: Alert Alert Prompt Prompt Confirm Confirm Alert – zobrazí upozorňovací.
Sorty Bubble, Insert a Quick
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
NEÚPLNÁ PODMÍNKA V JAVĚ. VÝVOJOVÝ DIAGRAM +- Podmínka Příkaz_1.
1 / 9X36DSA 2005The complexity of different algorithms varies: O(n), Ω(n 2 ), Θ(n·log 2 (n)), … Různé algoritmy mají různou složitost: O(n), Ω(n 2 ), Θ(n·log.
Rozklad problému na podproblémy, rekurze
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
POSLOUPNOST úkol 1_41. ZADÁNÍ Sestavte program, který doplní tabulku nepřímé úměrnosti pro hodnoty proměnné x = 1, …, n. Nepřímá úměrnost je zadána uživatelem.
C – jak na procedury Mgr. Lenka Švancarová. C – procedury #include int main() { printf("Ahoj\n"); return(0); } #include void pozdrav(void) { printf("Ahoj\n");
PŘÍKAZ while úkol 1_42.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
ZÁKLADNÍ POJMY. ZDROJOVÝ TEXT PROGRAMU Tvoří: klíčová slova komentáře identifikátory.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část I.
Sylabus V rámci PNV budeme řešit konkrétní úlohy a to z následujících oblastí: Nelineární úlohy Řešení nelineárních rovnic Numerická integrace Lineární.
Rekurze. volání podprogramu opětovně v jeho těle –v době, kdy předchozí volání ještě nebylo ukončeno Druhy rekurze přímá rekurze nepřímá rekurze.
Funkce, intuitivní chápání složitosti
NEÚPLNÁ PODMÍNKA V JAVĚ úkol 1_26. ZADÁNÍ Napište zdrojový kód k zadanému vývojovému diagramu.
PŘÍKAZ for úkol 1_47.
Řízení běhu programu, řídící struktury A0B36PRI - PROGRAMOVÁNÍ
PŘÍKAZ do - while úkol 1_43.
Procedurální programování,
Algoritmizace a programování Algoritmy 1 - Úvod. Základní pojmy Počítačový program Počítačový program zápis zdrojového kódu, kterému rozumí počítač zápis.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
M2160 – Úvod do programování II
Rekurze.
C# konzole – Podíl dvou čísel, podmínka IF
Jakub Brodský Ondřej Radosta
Rekurze.
© Copyright Radim Štefan
Podprogramy.
C# přehled vlastností.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Algoritmizace Dynamické programování
Algoritmizace a datové struktury (14ASD)
Transkript prezentace:

alg51 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í metod 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

alg52 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 metodami, proměnné pocet a stroj pro ně budou statickými (čili nelokálními) proměnnými

alg53 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() { … } }

alg54 Hra NIM static void zadaniPoctu() { do { Sys.pln( "zadejte počet zápalek (od 15 do 35)" ); pocet = Sys.readInt(); } while (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; }

alg55 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 >0, –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; }

alg56 Rekurzivní algorimus Rekurzivní algoritmus v některém kroku volá sám sebe Rekurzivní metoda v některém příkazu volá sama sebe ( i nepřímo ) 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); }

alg57 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); }

alg58 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 lze přemístit jen jeden disk, a to vždy z jehly na jehlu ( ne někam mimo ), -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)

alg59 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); }

alg510 Obecně k rekurzivitě Rekurzivní metody 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 metod 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 fibonacci(int i) { if (i==0) return 0; if (i==1) return 1; return fibonacci(i-1)+fibonacci(i-2) }

alg511 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