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

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

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

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Časová a prostorová složitost algoritmů

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

Struktura programu v době běhu

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Rozklad problému na podproblémy

(Úlohy z MO kategorie P, 32. část)

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

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.

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

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

NPRG030 Programování I, 2015/16 1 / :25:32

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

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

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

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Rekurzivní algoritmy

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

Úvod do informatiky. Miroslav Kolařík

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

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

Programovací jazyk Pascal

5. Dynamické programování

Rekurze. Pavel Töpfer, KSVI MFF UK Praha. 1. Co je to rekurze Rekurze v programech Rekurzivní algoritmy... 10

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

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

Dynamické programování

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Rozklad problému na podproblémy, rekurze

Úvod do programování 10. hodina

Rozklad problému na podproblémy, rekurze

Digitální učební materiál

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

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

Dynamické programování

Úvod do programování

Kombinatorika, výpočty

Implementace LL(1) překladů

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Programovani v Maplu Procedura

Klasický podprogram, který nazýváme procedura. Jedná se v podstatě o příkaz. 1

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

Principy indukce a rekursivní algoritmy

dovolují dělení velkých úloh na menší = dekompozice

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

NPRG030 Programování I, 2017/18 1 / :22:16

Poslední nenulová číslice faktoriálu

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

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

Programování. Psaní čistého kódu. Martin Urza

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

Anotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,

Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla

Závěrečná zkouška z informatiky 2011

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

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

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

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

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.

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

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ě

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

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

PODPROGRAMY PROCEDURY A FUNKCE

[1] Determinant. det A = 0 pro singulární matici, det A 0 pro regulární matici

Stromy, haldy, prioritní fronty

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

NPRG030 Programování I, 2018/19 1 / :03:07

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Sada 1 - Základy programování

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

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ě

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

Podprogramy; procedury a funkce

NPRG030 Programování I RNDr.Tomáš Holan, Ph.D. 4.patro, č

Sada 1 - Základy programování

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

Jednoduché cykly

Algoritmizace a programování

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

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

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Programy na PODMÍNĚNÝ příkaz IF a CASE

Martin Flusser. November 1, 2016

Aproximace funkcí. x je systém m 1 jednoduchých, LN a dostatečně hladkých funkcí. x c m. g 1. g m. a 1. x a 2. x 2 a k. x k b 1. x b 2.

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Algoritmizace řazení Bubble Sort

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

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

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

12. Globální metody MI-PAA

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Základy algoritmizace a programování

Dynamické programování

Digitální učební materiál

Transkript:

Rekurze V programování ve dvou hladinách: - rekurzivní algoritmus (řešení úlohy je definováno pomocí řešení podúloh stejného charakteru) - rekurzivní volání procedury nebo funkce (volá sama sebe přímo nebo nepřímo prostřednictvím jiných procedur resp. funkcí) Většinou se rekurzivní algoritmy realizují pomocí rekurzivních volání, ale není to nezbytné: - rekurzivní algoritmus lze realizovat bez rekurzivních volání (pomocí vlastního zásobníku na uložení rozpracovaných nedokončených podúloh) více práce pro programátora, program obvykle delší a méně přehledný, výpočet ale může být o něco efektivnější - rekurzivní volání lze teoreticky použít i při realizaci nerekurzivních iteračních algoritmů (dokonce každý cyklus lze nahradit rekurzivní procedurou) většinou nevhodné, nečitelný a méně efektivní program Pavel Töpfer, 2017 Programování 1-8 1

Rekurzivní volání - najednou je rozpočítáno více exemplářů téže procedury - všechny počítají podle téhož kódu - každý exemplář má na zásobníku svůj vlastní aktivační záznam s lokálními proměnnými, parametry a technickými údaji (kde je rozpočítán, návratová adresa) - procedura nemá přístup k lokálním proměnným jiného rekurzivního exempláře procedure Otoc; var U: char; read(u); if U <> then Otoc; write(u) end; Vstup: ABC_ Výstup: _CBA Pavel Töpfer, 2017 Programování 1-8 2

Příklad: Eukleidův algoritmus realizovaný funkcí s cyklem (bylo dříve) function NSD(X, Y: integer): integer; while X <> Y do if X > Y then X:=X - Y else Y:=Y - X; NSD:=X end; {function NSD} Pavel Töpfer, 2017 Programování 1-8 3

Eukleidův algoritmus realizovaný rekurzivní funkcí - přesně kopíruje rekurzivní vztah pro NSD, na němž je Eukleidův algoritmus založen (bylo dříve): když X < Y NSD(X,Y) = NSD(X,Y-X) když X > Y NSD(X,Y) = NSD(X-Y,Y) když X = Y NSD(X,Y) = X function NSD(X, Y: integer): integer; if X > Y then NSD:=NSD(X-Y, Y) else if Y > X then NSD:=NSD(X, Y-X) else {X=Y} NSD:=X end; {function NSD} Pavel Töpfer, 2017 Programování 1-8 4

Faktoriál N! (součin čísel od 1 do N) rekurzivní definice: N! = 1 pro N = 0 N.(N-1)! pro N > 0 function Faktorial (N: integer): integer; var F, I: integer; F:=1; for I:=2 to N do F:=F * I; Faktorial:=F end; časová složitost O(N) function Faktorial (N: integer): integer; if N=0 then Faktorial:=1 else Faktorial:=N * Faktorial(N-1) end; časová složitost O(N) Pavel Töpfer, 2017 Programování 1-8 5

Fibonacciho čísla 0 pro N = 0 F N = 1 pro N = 1 F N-1 + F N-2 pro N > 1 rekurzivní definice posloupnosti čísel realizace rekurzivní funkcí přesně podle definice: function Fib(N: integer): integer; if N=0 then Fib:=0 else if N=1 then Fib:=1 else Fib:=Fib(N-1) + Fib(N-2) end; funkce teoreticky správná, ale časová složitost O(2 N ) pro N > cca 30 prakticky nepoužitelná důvod: mnohokrát se opakovaně počítají stejné věci Pavel Töpfer, 2017 Programování 1-8 6

Možnosti řešení: 1. rekurzivní algoritmus + pomocné pole velikosti O(N) pro uložení již spočítaných funkčních hodnot každé F i se počítá jen jednou časová složitost O(N) chytrá rekurze, memoizace, dynamické programování 2. počítat hodnoty iteračně odspodu v pořadí F 1, F 2, F N časová složitost O(N), navíc stačí konstantní paměť dynamické programování 3. z rekurzivní definice odvodit explicitní vzorec a počítat podle něj F N 5 5 1 2 5 N 1 2 5 N Pavel Töpfer, 2017 Programování 1-8 7

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

Použití rekurze Úlohy typu zkoušení všech možností nebo generování všech možností Příklad: vypsat všechna K-ciferná čísla v poziční soustavě o základu N Pokud K je předem pevně dáno: for i1:=0 to N-1 do for i2:=0 to N-1 do for i3:=0 to N-1 do for ik:=0 to N-1 do writeln(i1, i2, i3,, ik) Je-li K vstupním údajem, nemůžeme toto zapsat pomocí vnořených cyklů nevíme předem, kolik jich máme v programu napsat. Pavel Töpfer, 2017 Programování 1-8 9

Řešení: rekurzivní procedura obsahující jeden takový cyklus, rekurzivní zanoření jde vždy do hloubky K. const MaxK = 20; {max. přípustné K} var C: array[1..maxk] of byte; {uložení čísla} N, K: byte; write('zadejte hodnoty K a N: '); readln(k,n); Cislo(1); end. Pavel Töpfer, 2017 Programování 1-8 10

procedure Cislo(p:byte); {p - pořadí vybírané cifry čísla} {procedura používá globální proměnné C, K, N} var i,j:byte; for i:=0 to N-1 do C[p] := i; if p < K then Cislo(p+1) else for j:= 1 to K do write(c[j]); writeln end end end; Pavel Töpfer, 2017 Programování 1-8 11

procedure Cislo(p:byte); {p - pořadí vybírané cifry čísla} {procedura používá globální proměnné C, K, N} var i:byte; if p > K then {hotovo} for i:= 1 to K do write(c[i]); writeln end else {doplnit C[p]} for i:=0 to N-1 do C[p] := i; Cislo(p+1) end end; Pavel Töpfer, 2017 Programování 1-8 12

Variace s opakováním K-prvkové z N-prvkové množiny {1,2,,N} = všechny uspořádané K-tice tvořené prvky z {1,2,,N} s možností opakování hodnot Např. pro K=2, N=4: (1,1) (1,2) (1,3) (1,4) (2,1), (2,2) (2,3) (2,4) (3,1) (3,2) (3,3) (3,4) (4,1), (4,2) (4,3) (4,4) Řešení: na každou z K pozic vytvářené variace postupně umístíme každé z N čísel Pavel Töpfer, 2017 Programování 1-8 13

Kombinace bez opakování K-prvkové z N-prvkové množiny {1,2,,N} = všechny K-prvkové podmnožiny vybrané z množiny {1,2,,N} (bez možnosti opakování hodnot) Např. pro K=2, N=4: (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) Řešení: generujeme pouze ostře rostoucí K-tice hodnot z množiny {1,2,,N} Pavel Töpfer, 2017 Programování 1-8 14

Doplnění znamének Je dáno N celých čísel a požadovaný součet C. Před čísla doplňte znaménka + nebo tak, aby byl součet čísel se znaménky roven danému C. Nalezněte všechna řešení úlohy. Řešení: před každé číslo zkusíme postupně dát + nebo, po vytvoření celé N-tice znamének otestujeme součet 2 N možností, tedy časové složitost O(2 N ) Pavel Töpfer, 2017 Programování 1-8 15

Rozklad čísla Zadané kladné celé číslo N rozložte všemi různými způsoby na součet kladných celých sčítanců. Rozklady lišící se pouze pořadím sčítanců nepovažujeme za různé. Příklad: 5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1 Řešení: Aby se neopakovaly stejné rozklady s různým pořadím sčítanců, budeme vytvářet pouze rozklady s nerostoucím pořadím sčítanců. Na každou pozici rozkladu vždy vyzkoušíme všechny přípustné hodnoty (maximálně kolik ještě zbývá a max. kolik je na předchozí pozici, minimálně 1). Provádíme, dokud je co rozkládat. Pavel Töpfer, 2017 Programování 1-8 16