+ All Categories
Home > Documents > Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno,...

Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno,...

Date post: 22-Feb-2020
Category:
Upload: others
View: 4 times
Download: 0 times
Share this document with a friend
73
Rekurze IB111 Z´ aklady programov´ an´ ı Radek Pel´ anek 2018 1 / 72
Transcript
Page 1: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Rekurze

IB111 Zaklady programovanıRadek Pelanek

2018

1 / 72

Page 2: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

xkcd: Tabletop Roleplaying

https://xkcd.com/244/

2 / 72

Page 3: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

To iterate is human, to recurse divine. (L. Peter Deutsch)

3 / 72

Page 4: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Rekurze

pouzitı funkce pri jejı vlastnı definici

volanı sebe sama (s jinymi parametry)

4 / 72

Page 5: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Sebereference

https://xkcd.com/688/

5 / 72

Page 6: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Sebereferencnı test

1 Ktere pısmeno nenı spravnou odpovedı na zadnou otazku:(A) A (B) C (C) B

2 Odpoved’ na 3. otazku je:(A) stejna jako na 1. otazku (B) stejna jako na 2.otazku (C) jina nez odpovedi na 1. a 2. otazku

3 Prvnı otazka, na kterou je odpoved’ A, je otazka:(A) 1 (B) 2 (C) 3

Hlavolamikon

6 / 72

Page 7: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Pirati

5 piratu si delı poklad: 100 mincı

nejstarsı pirat navrhne rozdelenı, nasleduje hlasovanı

alespon polovina hlasu ⇒ rozdeleno, hotovo

jinak ⇒ navrhujıcı pirat zabit, pokracuje druhy nejstarsı(a tak dale) (rekurze!)

priority1 prezıt2 mıt co nejvıce mincı3 zabıt co nejvıc ostatnıch piratu

slozitejsı varianty: 6 piratu a 1 mince, 300 piratu a 100 mincı

7 / 72

Page 8: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Rekurze a sebereference

Rekurze a sebereference – klıcove myslenky v informatice

nektere souvislosti:

matematicka indukce

funkcionalnı programovanı

rekurzivnı datove struktury (napr. stromy)

gramatiky

logika, neuplnost

nerozhodnutelnost, diagonalizace

8 / 72

Page 9: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Rekurze a sebereference

... nejen v informatice

M. C. Escher; Drawing Hands, 1948

Godel, Escher, Bach: An Eternal Golden Braid; DouglasHofstadter

9 / 72

Page 10: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Rekurze a uvodnı programovanı

uvedene aplikace rekurze a sebereference casto pomernenarocne

hodı se poradne pochopit rekurzi na urovnijednoduchych programu

bezprostrednı navaznost – Algoritmy a datove struktury

10 / 72

Page 11: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Faktorial

n! = 1 · 2 · · · (n − 1) · n

f (n) =

{1 pokud n = 1

n · f (n − 1) pokud n > 1

11 / 72

Page 12: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Faktorial iterativne (pomocı cyklu)

def fact(n):

f = 1

for i in range(1, n+1):

f = f * i

return f

12 / 72

Page 13: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Faktorial rekurzivne

def fact(n):

if n == 1: return 1

else: return n * fact(n-1)

13 / 72

Page 14: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Faktorial rekurzivne – ilustrace vypoctu

fact(4)

4 * fact(3)

3 * fact(2)

2 * fact(1)

11

2

6

24

14 / 72

Page 15: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Prıklad: vypis cısel

Vymyslete funkci, ktera:

vypıse cısla od 1 do N

pomocı rekurze – bez pouzitı cyklu for, while

15 / 72

Page 16: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Prıklad: vypis cısel

Vymyslete funkci, ktera:

vypıse cısla od 1 do N

pomocı rekurze – bez pouzitı cyklu for, while

def sequence(n):

if n > 1:

sequence(n-1)

print(n)

16 / 72

Page 17: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Co udela tento program?

def test(n):

print(n)

if n > 1:

test(n-1)

print(-n)

test(5)

17 / 72

Page 18: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Ilustrace zanorovanı

test(1)

test(2)

test(3)

3

2

1 -1

-2

-3

18 / 72

Page 19: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Neprıma rekurze

def even(n):

print("even", n)

odd(n-1)

def odd(n):

print("odd", n)

if n > 1:

even(n-1)

even(10)

19 / 72

Page 20: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Rekurzivnı stromecek

20 / 72

Page 21: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Rekurzivnı stromecek

nakreslit stromecek znamena:

udelat stonek

nakreslit dva mensı stromecky (pootocene)

vratit se na puvodnı pozici

21 / 72

Page 22: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Stromecek zelvı grafikou

def tree(length):

forward(length)

if length > 10:

left(45)

tree(0.6 * length)

right(90)

tree(0.6 * length)

left(45)

back(length)

22 / 72

Page 23: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Podoby rekurze, odstranenı rekurze

koncova rekurze (tail recursion)

rekurzivnı volanı je poslednı prıkaz funkcelze vesmes prımocare nahradit cyklem

”plna“ rekurze

”zanorujıcı se“ volanı

napr. stromeceklze prepsat bez pouzitı rekurze za pouzitı zasobnıkurekurzivnı podoba casto vyrazne elegantnejsı

23 / 72

Page 24: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Hanojske veze aneb O konci sveta

video:

https://www.fi.muni.cz/~xpelanek/IB111/hanojske_veze/

https://www.youtube.com/watch?v=8yaoED8jc8Y

klaster kdesi vysoko v horach u mesta Hanoj

velka mıstnost se tremi vyznacenymi mısty

64 ruzne velkych zlatych disku

podle vestby majı mnisi presouvat disky z prvnıho na tretımısto

a az to dokoncı ...

24 / 72

Page 25: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Hanojske veze: pravidla

N disku ruznych velikostı naskladanych na sobe

vzdy muze byt jen mensı disk polozen na vetsım

moznost presunout jeden hornı disk na jiny kolıcek

cıl: presunout vse z prvnıho na tretı

25 / 72

Page 26: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Hanojske veze: resenı

A B C A B C A B C A B C

A B CA B CA B CA B C

26 / 72

Page 27: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Hanojske veze: vystup programu

>>> solve(3, "A", "B", "C")

A -> B

A -> C

B -> C

A -> B

C -> A

C -> B

A -> B

27 / 72

Page 28: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Hanojske veze: rekurzivnı resenı

def solve(n, start, end, auxiliary):

if n == 1:

print(start, "->", end)

else:

solve(n-1, start, auxiliary, end)

solve(1, start, end, auxiliary)

solve(n-1, auxiliary, end, start)

28 / 72

Page 29: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Resenı vcetne vypisovanı stavu

*

***

*****

-------------------

***

***** *

-------------------

***** *** *

-------------------

*

***** ***

-------------------

*

*** *****

-------------------

* *** *****

-------------------

29 / 72

Page 30: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Stav ulohy, reprezentace

stav ulohy = rozmıstenı disku na kolıcıch

disky na kolıku A → seznam

celkovy stav:

3 promenne, v kazde seznam – nepekneseznam seznamu, kolıky interne znacıme 0, 1, 2

prıklad stavu (6 disku): [[4], [5, 2, 1], [6, 3]]

30 / 72

Page 31: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Resenı vcetne vypisovanı stavu

def solve(n, start, end, aux, state):

if n==1:

disc = state[start].pop()

state[end].append(disc)

print_state(state)

else:

solve(n-1, start, aux, end, state)

solve(1, start, end, aux, state)

solve(n-1, aux, end, start, state)

def solve_hanoi(n):

state = [list(range(n,0,-1)), [], []]

print_state(state)

solve(n, 0, 2, 1, state)

31 / 72

Page 32: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Vypisovanı stavu – jednoduse

def print_state(state):

print(state)

print("--")

def print_state(state):

for i in range(3):

print("Peg", chr(ord(’A’)+i), state[i])

print("--")

32 / 72

Page 33: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Vypisovanı stavu – textova grafika

def print_state(state):

n = sum([len(s) for s in state])

for y in range(n+1):

line = ""

for peg in range(3):

for x in range(-n+1, n):

if len(state[peg]) > n-y and

abs(x) < state[peg][n-y]:

line += "*"

else:

line += " "

line += " "

print(line)

print("-"*(n*6+1))

33 / 72

Page 34: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Sierpinskeho fraktal

rekurzivne definovany geometricky utvar

34 / 72

Page 35: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Sierpinskeho fraktal

35 / 72

Page 36: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Sierpinskeho fraktal: kod

def sierpinski(n, length):

if n == 1:

triangle(length)

else:

for i in range(3):

sierpinski(n - 1, length)

forward((2 ** (n - 1)) * length)

right(120)

36 / 72

Page 37: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Dalsı podobne fraktaly

37 / 72

Page 38: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Robotanik

tutor.fi.muni.cz, uloha Robotanik

jednoduche”graficke“ programovanı robota

tezsı prıklady zalozeny na rekurzi

vizualizace prubehu”vypoctu“, zanorovanı a vynorovanı z

rekurze

38 / 72

Page 39: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Robotanik – Kurz pocıtanı

rekurze jako”pamet’“

39 / 72

Page 40: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Robotanik

40 / 72

Page 41: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Pokryvanı plochy L kostickami

mrızka 8× 8 s chybejıcım levym hornım polem

ukol: pokryt zbyvajıcı polıcka pomocı L kosticek

rozsırenı:

rozmer 2n × 2n

chybejıcı libovolne poleobarvenı 3 barvami, aby sousedi byli ruznı

41 / 72

Page 42: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Ukazky resenı

42 / 72

Page 43: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Resenı

rozdelit na ctvrtiny

umıstit jednu kostku

rekurzivne aplikovat resenı na jednotlive casti

43 / 72

Page 44: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Kahoot

44 / 72

Page 45: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Kahoot: program A

def magic(n):

return n + magic(n)

45 / 72

Page 46: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Kahoot: program B

def test(n):

if n > 0:

print(n, end="")

test(n-1)

print(n, end="")

test(3)

46 / 72

Page 47: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Premyslenı o funkcıch (rekurzivnıch obzvlast’)

obecne pro funkce:

ujasnit vstupne-vystupnı chovanı nez zacnu psat funkci

rekurzivnı funkce navıc:

pri psanı funkce predpokladam, ze mam jiz funkci hotovou

problem prevedu na resenı mensıho problemu (ktery jizumım vyresit)

osetrım”koncovou podmınku“

47 / 72

Page 48: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Otocenı retezce rekurzivne

>>> reverse("star wars")

’sraw rats’

def reverse(s):

if len(s) <= 1: return s

return reverse(s[1:]) + s[0]

48 / 72

Page 49: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Otocenı retezce rekurzivne

>>> reverse("star wars")

’sraw rats’

def reverse(s):

if len(s) <= 1: return s

return reverse(s[1:]) + s[0]

48 / 72

Page 50: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Kontrolnı otazka

Co dela nasledujıcı funkce (vstup je retezec)?

def magic(s):

if len(s) <= 1: return s

return magic(s[1:])

49 / 72

Page 51: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Seznam vnorenych seznamu

Seznam cısel a vnorenych seznamu cısel (SCAVSC) je seznam,ktery obsahuje cısla nebo SCAVSC.

rekurzivnı datova struktura

scavsc = [[2, 8], 4, [3, [1, 7], 6], [2, 4]]

Jak vypocıtat soucet vsech cısel?

50 / 72

Page 52: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Soucet vnorenych seznamu

def nested_list_sum(alist):

total = 0

for x in alist:

if isinstance(x, list):

total += nested_list_sum(x)

else:

total += x

return total

51 / 72

Page 53: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Prıklady pouzitı rekurze v informatice

Eucliduv algoritmus – NSD

vyhledavanı opakovanym pulenım

radicı algoritmy (quicksort, mergesort)

generovanı permutacı, kombinacı

fraktaly

prohledavanı grafu do hloubky

gramatiky

52 / 72

Page 54: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Eukliduv algoritmus rekurzivne

def nsd(a,b):

if b == 0:

return a

else:

return nsd(b, a % b)

53 / 72

Page 55: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Vyhledavanı opakovanym pulenım

hra na 20 otazek

hledanı v seznamu

hledanı v binarnım stromu

54 / 72

Page 56: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Vyhledavanı: rekurzivnı varianta

def binary_search(value, alist, lower, upper):

if lower > upper:

return False

mid = (lower + upper) // 2

if alist[mid] < value:

return binary_search(value, alist, mid+1, upper)

elif alist[mid] > value:

return binary_search(value, alist, lower, mid-1)

return True

55 / 72

Page 57: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Radicı algoritmy

quicksort

vyber pivotarozdel na mensı a vetsızavolej quicksort na podcasti

mergesort

rozdel na polovinukazdou polovinu serad’ pomocı mergesortspoj obe poloviny

56 / 72

Page 58: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Generovanı permutacı, kombinacı

permutace mnoziny = vsechna mozna poradı

prıklad: permutace mnoziny {1, 2, 3, 4}jak je vypsat systematicky?jak vyuzıt rekurzi?

k-prvkove kombinace n-prvkove mnoziny = vsechnymozne vybery k prvku

prıklad: 3-prvkove kombinace mnoziny {A,B,C ,D,E}jak je vypsat systematicky?jak vyuzıt rekurzi?

57 / 72

Page 59: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Kombinace

(n

k

)=

(n − 1

k − 1

)+

(n − 1

k

)

def combinations(alist, k):

if k == 0: return [[]]

if len(alist) < k: return []

output = []

for comb in combinations(alist[1:], k-1):

comb.append(alist[0])

output.append(comb)

output.extend(combinations(alist[1:], k))

return output

58 / 72

Page 60: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Nevhodne pouzitı rekurze

ne kazde pouzitı rekurze je efektivnı

Fibonacciho posloupnost (kralıci):

f1 = 1

f2 = 1

fn = fn−1 + fn−2

1, 1, 2, 3, 5, 8, 13, 21, 34, . . .

Vi Hart: Doodling in Math: Spirals, Fibonacci, and Being a Plant

59 / 72

Page 61: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Fibonacciho posloupnost: rekurzivne

def fib(n):

if n <= 2: return 1

else: return fib(n-1) + fib(n-2)

60 / 72

Page 62: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Fibonacciho posloupnost: rekurzivnı vypocet

fib(4)

fib(2)

1

fib(3)

fib(2)fib(1)

1 1

fib(5)

+

+ + fib(3)

fib(2)fib(1)

1 1

+

61 / 72

Page 63: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Problem N dam

sachovnice N × N

rozestavit N dam tak, aby se vzajemne neohrozovaly

zkuste pro N = 4

pozn. specialnı prıpad”problemu splnenı podmınek“

62 / 72

Page 64: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Problem N dam – resenı

63 / 72

Page 65: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Problem N dam – algoritmus

ilustrace algoritmu backtracking

hruba sıla, ale”chytre“

zacneme s prazdnym planem, systematicky zkousımeumist’ovat damy

pokud najdeme kolizi, vracıme se a zkousıme jinoumoznost

prirozeny rekurzivnı zapis

64 / 72

Page 66: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Problem N dam – backtracking

řešení

65 / 72

Page 67: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Problem N dam – reprezentace stavu

pro kazde pole si pamatujeme, zda na nem je/nenı dama

dvourozmerny seznam True/False

pro kazdou damu si pamatujeme jejı souradnice

seznam dvojic xi , yi

pro kazdy radek si pamatujeme, v kterem sloupci je dama

seznam cısel xinejvyhodnejsı reprezentace

66 / 72

Page 68: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Problem N dam – resenı

def solve_queens(n, state):

if len(state) == n:

output(state)

return True

else:

for i in range(n):

state.append(i)

if check_queens(state):

if solve_queens(n, state): return True

state.pop()

return False

67 / 72

Page 69: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Kdy se ohrozujı dve damy?

x

y

1

1

x2

y2

68 / 72

Page 70: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Kdy se ohrozujı dve damy?

x

y

1

1

x2

y2

x1 = x2y1 = y2x1 + y1 = x2 + y2x1 − y1 = x2 − y2

69 / 72

Page 71: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Problem N dam – resenı

def output(state):

for y in range(len(state)):

for x in range(len(state)):

if state[y]==x: print("X", end=" ")

else: print(".", end=" ")

print()

print()

def check_queens(state):

for y1 in range(len(state)):

x1 = state[y1]

for y2 in range(y1+1, len(state)):

x2 = state[y2]

if x1 == x2 or x1-y1 == x2-y2 or\

x1+y1 == x2+y2:

return False

return True70 / 72

Page 72: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Backtracking – dalsı prıklady pouzitı

mnoho logickych uloh:

Sudoku a podobne ulohyalgebrogramy (SEND + MORE = MONEY)

optimalizacnı problemy (napr. rozvrhovanı, planovanı)

obecny”problem splnenı podmınek“

71 / 72

Page 73: Rekurze - Masaryk Universityxpelanek/IB111/slidy/rekurze.pdfalespon polovina hlas u )rozd eleno, hotovo jinak )navrhuj c pir at zabit, pokra cuje druh y nejstar s (a tak d ale) (rekurze!)

Shrnutı

rekurze: vyuzitı rekurze pro definici sebe sama

logicke ulohy: Hanojske veze, L kosticky, damy nasachovnici

fraktaly

aplikace v programovanı: vyhledavanı, razenı,prohledavanı grafu

klıcova myslenka v informatice

nezapomente na piraty

72 / 72


Recommended