Co bylo na mých přednáškách z NMIN101 Programování 1 v roce 2016/17 ======================================================================= 21. 12. 2016: * urychlení rekurse ukládáním výsledků * HRY: - příklad odebírání zápalek - konečné hry s úplnou informací - rekurentní definice prohrávající a vyhrávající pozice (kdyby neexistovala remíza) - strom hry (nemusí být strom) - konečný počet sehrávek, u každé známý výsledek - důsledek: existence neprohrávající strategie - rekurentní definice -->> rekurzivní funkce - hry s ohodnocením: - hry s nulovým součtem (- hry s nenulovým součtem - Vězňovo dilema) - algoritmus Minimax - příklad: odebírání z řady čísel zleva/zprava - počítání směrem dolů - počítání směrem nahoru - negamax - opravdové hry: - příliš veliké - alfa-beta prořezávání - heuristika pořadí tahů - počítání do omezené hloubky a nahrazení statickou ohodnocovací funkcí - procházení do rostoucí hloubky - příklad BP/CHESS 14. 12. 2016: * Příklady využití rekurze ke zkoušení všech možností. - rozklad čísla na součet kladných sčítanců - ...v rostoucím pořadí - loupeznici/batoh? * Zrychlení backtrackingu pomocí heuristik - co je heuristika - heuristika pro loupežníky – proskákání šachovnice koněm. * Metoda Rozděl a panuj – princip, příklady použití. - Vyhodnocování výrazu rozkladem na podvýrazy = bylo na prnvi prednasce - MergeSort //- Binární vyhledávání * Prohledávání do šířky - příklady: - nejkratší cesta koněm na šachovnici - prohledavani stavoveho prostoru - prelevani vody 07. 12. 2016: * dva typické způsoby použití rekurze: 1) Rozděl a panuj (např. vyhodnocení výrazu - minule) 2) prohledávání do hloubky (např. minule všechny permutace) * složitost různých rekursivních algoritmů (často exponenciální!) * prohledávání do šířky (pomocí fronty) a prohledávání do hloubky (pomocí zásobníku) * příklad prohledávání do hloubky - proskákat šachovnici koněm - zkusit a zase uklidit: - buďto umíme vrátit krok - nebo si pamatovat kopii celého stavu * příklad prohledávání do hloubky - N dam na šachovnici - zkoušet dámu na všechny možné pozice - jednu dámu na každý řádek a zkoušet jen různá x - jak poznat, zda je políčko ohrožené 30. 11. 2016: Rekurze: * podprogram může volat sám sebe * ...a někdy je to užitečné * instance/volání podprogramu se ukládají na systémový ZÁSOBNÍK VOLÁNÍ a po návratu ze zavolání sama sebe se k nim zase vracíme a pokračujeme Příklady: * procedura, která volá sama sebe, pořád = k ničemu, jen ilustrace volání a call-stacku * VytiskniVsechnaKladnaCislaMensiNeboRovnaN = jak funguje, tisk popředu/pozadu... * vyhodnocení výrazu rozkladem na podvýrazy = něco užitečného a přitom (doufám) ne tak těžké na pochopení * faktoriál * Hanojské věže * vypsání všech permutací * ...a variací apod. Klady a zapory rekurse: * zápor: stojí nás to čas a paměť * klad: lze snadno zapsat řešení jinak těžkých úloh --------------------------------------------------------------------------