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

Podobné dokumenty
Rozklad problému na podproblémy

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

Rozklad problému na podproblémy, rekurze

Rozklad problému na podproblémy, rekurze

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

Dekompozice problému, rekurze

Algoritmizace a programování

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

10. Složitost a výkon

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

11. Přehled prog. jazyků

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

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

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

Standardní knihovny C. Rekurze.

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

5. Vyhledávání a řazení 1

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

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

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

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

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

5. Dynamické programování

Rekurze. IB111 Úvod do programování

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

IB111 Úvod do programování skrze Python

Úvod do programování 10. hodina

Část I. Část 1 Standardní knihovny, čtení/zápis ze souboru. Přehled témat. Standardní knihovny C. Rekurze. Standardní knihovny

Standardní knihovny C. Rekurze.

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

Část 1 Standardní knihovny, čtení/zápis ze/do souboru

Rekurzivní algoritmy

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Rekurze. IB111 Základy programování Radek Pelánek

Dynamické programování

Algoritmy I, složitost

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

IB111 Úvod do programování skrze Python

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

Úvod do informatiky. Miroslav Kolařík

Programování v Pythonu

Dynamické programování

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

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

Prioritní fronta, halda

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

BI-EP1 Efektivní programování 1

Programy a algoritmy pracující s čísly. IB111 Úvod do programování skrze Python

Kombinatorika, výpočty

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

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

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

Časová a prostorová složitost algoritmů

Algoritmus. Cílem kapitoly je seznámit žáky se základy algoritmu, s jeho tvorbou a způsoby zápisu.

Řídicí struktury. alg3 1

Základní pojmy. Program: Algoritmus zapsaný v programovacím jazyce, který řeší nějaký konkrétní úkol. Jedná se o posloupnost instrukcí.

Martin Flusser. November 1, 2016

Základy algoritmizace a programování

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Úvod do teoretické informatiky(2017/2018) cvičení 11 1

a) b) c) Radek Mařík

Programy a algoritmy pracující s čísly. IB111 Úvod do programování skrze Python

Algoritmy a datové struktury

R zné algoritmy mají r znou složitost

3. Řízení běhu programu

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

Algoritmizace řazení Bubble Sort

SOUSTAVY LINEÁRNÍCH ALGEBRAICKÝCH ROVNIC

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Rekurze a rychlé třídění

IB111 Úvod do programování 1 / 62

Základy algoritmizace a programování

Implementace LL(1) překladů

ŠVP Gymnázium Ostrava-Zábřeh Úvod do programování

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

Základní datové struktury

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Dynamické datové struktury III.

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

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

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

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

Dynamické programování. Optimální binární vyhledávací strom

2. lekce Algoritmus, cyklus Miroslav Jílek

Algoritmizace prostorových úloh

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

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Podmíněný příkaz

Čá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

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

Poslední nenulová číslice faktoriálu

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

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Stromy, haldy, prioritní fronty

Lekce 01 Úvod do algoritmizace

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

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno

PROGRAMY PRO GIS. Formovat/formulovat problém pro aplikaci v počítači. Fungování GIS programů na základní úrovni - "uvažovat" jako počítač

Transkript:

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 1 Základy algoritmizace 8. Rekurze doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 2 Základy algoritmizace Dnes: Rekurze Faktoriál Obrácený výpis posloupnosti Hanojské věže Fibonacciho posloupnost

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 3 Rekurze To iterate is human, to recurse divine L. Peter Deutsch http://www.devtopics.com/101-great-computer-programming-quotes/

Rekurze Source: http://algosaur.us/recursion/ 4 Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 5 Výpočet faktoriálu Iterace Rekurze n! = n*(n-1)*(n-2)* *2*1 n! = 1 pro n 1 n! = n*(n-1)! pro n 1 def factoriali(n): f = 1 for i in range(n,1,-1): f*=i return f def factorialr(n): if n>1: return n * factorialr(n-1) else: return 1 Pozor, Python omezuje počet vnoření (default recursion limit) na 1000

Příklad výpis posloupnosti Úloha Vytvořte program, který přečte posloupnost čísel a vypíše ji v opačném pořadí Rozklad problému Zavedeme abstraktní příkaz obrať posloupnost Příkaz rozložíme do tří kroků: 1. Přečti číslo Číslo uložíme pro pozdější obrácený výpis 2. Pokud není detekován konec, obrať posloupnost Pokračujeme ve čtení čísel 3. Vypiš číslo Vypíšeme uložené číslo Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 6

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 7 Příklad výpis posloupnosti Řešení def reverse(): v = input() if v.isdigit(): reverse() print(v) return reverse() 1 2 3 a 3 2 1 v = 1 reverse() print(1) return v = 2 reverse() print(2) return v = 3 reverse() print(3) return v = a return

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 8 Příklad hanojské věže Úloha Přemístit disky na druhou jehlu s použitím třetí (pomocné) za dodržení pravidel: 1. 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 2. Položit větší disk na menší není povoleno

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 9

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 10

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 11

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 12

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 13

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 14

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 15

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 16

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 17

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 18

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 19

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 20

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 21

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 22

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 23

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 24

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 25

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 26

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 27

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 28

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 29

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 30

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 31

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 32

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 33

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 34

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 35

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 36

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 37

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 38

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 39

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 40

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 41

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 42

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 43

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 44 Příklad hanojské věže Řešení Zavedeme abstraktní příkaz movetower(n, 1, 2, 3) realizující přesun if n n> disků 0: z jehly 1 na jehlu 2 s použitím jehly 3. Pro n > 0 můžeme příkaz rozložit na tři jednodušší příkazy def movetower(n, tfrom, tto, tmp): movetower(n-1, tfrom, tmp, tto) #move to tmp print("moving disk from",tfrom,"to",tto) 1. movetower(n-1, 1, 3, 2) movetower(n-1, tmp, tto, tfrom) #move from tmp discs 2. = přenes 4 disk z jehly 1 na jehlu 2 movetower( discs, 1, 2, 3) 3. movetower(n-1, 3, 2, 1) Přesun n-1 disků z jehly 1 na jehlu 3 Přesun největšího disku na cílovou pozici (abstraktní) Přesun n-1 disků na cílovou pozici

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 45 Příklad hanojské věže Příklad výpisu 1 disk Moving disk from 1 to 2 2 disky Moving disk from 1 to 3 Moving disk from 1 to 2 Moving disk from 3 to 2 3 disky Moving disk from 1 to 2 Moving disk from 1 to 3 Moving disk from 2 to 3 Moving disk from 1 to 2 Moving disk from 3 to 1 Moving disk from 3 to 2 Moving disk from 1 to 2 4 disky Moving disk from 2 to 1 Moving disk from 2 to 3 Moving disk from 1 to 3 Moving disk from 1 to 2 Moving disk from 3 to 2 Moving disk from 3 to 1 Moving disk from 2 to 1 Moving disk from 3 to 2 Moving disk from 1 to 3 Moving disk from 1 to 2 Moving disk from 3 to 2

Rekurzivní algoritmy Rekurzivní funkce jsou přímou realizací rekurzivních algoritmů Rekurzivní algoritmus předepisuje výpočet shora dolů v závislosti na velikosti vstupních dat Pro nejmenší (nejjednodušší) vstup je výpočet určen přímo Pro obecný vstup je výpočet předepsán s využitím téhož algoritmu pro menší vstup Výhodou rekurzivních funkcí je jednoduchost a přehlednost Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 46

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 47 Rekurzivní algoritmy Příklad (pseudokód) def recursion(n): # do something before recursion if n is "trivial": return "solution" # or just do nothing else: sol = recursion(n - 1) # do something after recursion return n + sol

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 48 Rekurzivní algoritmy Příklad (studentská grafika) Je toto rekurze?

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 49 Rekurzivní algoritmy Nevýhodou rekurzivních algoritmů může být časová náročnost způsobená např. zbytečným opakováním výpočtu Řadu rekurzivních algoritmů lze nahradit iteračními, které počítají výsledek zdola nahoru, tj. od menších (jednodušších) vstupních dat k větším (složitějším) Pokud algoritmus zdola nahoru nenajdeme, lze rekurzivitu odstranit pomocí zásobníku Př. binární řešení hanojských věží Např. zásobník využijeme pro uložení stavu řešení problému def hanoibinary(n): for x in range(1,1<<n): print( "move from",(x&x-1)%3,"to",((x x-1)+1)%3 )

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 50 Příklad Fibonacciho posloupnost 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,... Nebo 0, 1, 1, 2, 3, 5,... F n = F n 1 + F n 2 pro F 1 = 1, F 2 = 1 nebo F 1 = 0, F 2 = 1 Nekonečná posloupnost přirozených čísel, kde každé číslo je součtem dvou předchozích Limita poměru dvou následujících čísel Fibonacciho posloupnosti je rovna zlatému řezu Sectio aurea ideální poměr mezi různými délkami Rozdělení úsečky na dvě části tak, že poměr vetší časti ku menší je stejný jako poměr celé úsečky k vetší části φ = 1+ 5 2 1,618 033 988 749 848

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 51 Příklad Fibonacciho posloupnost Historie Indičtí matematici (450 nebo 200BC) Leonardo Pisano (1175 1250) popis růstu populace králíků Italský matematik známý také jako Fibonacci F n velikost populace po n měsících za předpokladu, že První měsíc se narodí jediný pár Narozené páry jsou produktivní od 2. měsíce svého života Každý měsíc zplodí každý produktivní pár jeden další pár Králíci nikdy neumírají, nejsou nemocní atp. Henry E. Dudeney (1857 1930) popis populace krav Jestliže každá kráva vyprodukuje své první tele (jalovici) za rok a poté každý rok jednu další jalovici, kolik budete mít krav za 12 let, jestliže žádná nezemře a na počátku budete mít jednu krávu? Po 12 let je k dispozici jeden či více býků

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 52 Příklad Fibonacciho posloupnost Řešení Platí: f 0 = 1 f 1 = 1 f n = f n-1 + f n-2, pro n > 1 def fibonacci(n): if n<2: return 1 return fibonacci(n-1)+fibonacci(n-2) Zápis je elegantní, ale je takový výpočet efektivní?

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 53 Příklad Fibonacciho posloupnost Řešení Platí: f 0 = 1 f 1 = 1 f n = f n-1 + f n-2, pro n > 1 def fibonacci(n): if n<2: return 1 return fibonacci(n-1)+fibonacci(n-2) Zápis je elegantní, ale je takový výpočet efektivní?

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 54 Příklad Fibonacciho posloupnost Počet operací při výpočtu Fibonacciho čísla def fibonaccir(n): global counter counter +=1 if n<2: return 1 return fibonaccir(n-1)+fibonaccir(n-2) def fibonaccii(n): global counter fib = fibm1 = fibm2 = 1 for i in range(2,n+1): fibm2 = fibm1 fibm1 = fib fib = fibm1 + fibm2 counter +=3 return fib counter = 0 print(fibonaccir(30), counter) counter = 0 print(fibonaccii(30), counter) 1346269 2692537 1346269 87

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 55 Příklad Fibonacciho posloupnost Rekurzivní výpočet Počet operací roste exponenciálně s n 2 n Iterační algoritmus Počet operací je proporcionální k n 3n Skutečný počet operací závisí na konkrétní implementaci, programovacím jazyku (překladači) a hardware O efektivitě a složitosti algoritmů budeme hovořit v jedné z příštích přednášek Připomeňte si rekurzi v řadících algoritmech

Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 56 Základy algoritmizace Dnes: Rekurze Faktoriál Obrácený výpis posloupnosti Hanojské věže Fibonacciho posloupnost Více najdete např. na http://algosaur.us/recursion/ https://mitpress.mit.edu/sicp/full-text/book/book-z-h-11.html Příště vyhledávání a řazení 3.