Table of Contents

Cvičení 7: Rekurze, třídění

Rekurze

Při rekurzivním volání volá funkce samu sebe. Aby nedošlo k nekonečné smyčce, musí toho volání obsahovat ukončovací podmínku. Obecně lze rekurzi zapsat

def funkce(promenna):
   if (ukoncovaci podminka):
      funkce(zmenena_promenna)         

Pomocí rekurze můžeme například implementovat for cyklus:

def recursivePrint(index, array):
    if (index < len(array) ):
        print(array[index], end=' ' );
        recursivePrint(index+1, array)
        print(array[index], end=' ' );
 
a = []
for i in range(10):
    a.append(i*i)
 
print("List je",a)
recursivePrint(0, a);

Úkol 1: narovnání

a=[1, 2, [3, [4, 5], 6, [7]], [8, 9], 10]

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

if type(x) is list:

Úkol 2: binomický koeficient

Úkol 3: výpočet Fibonacciho posloupnosti

Napište rekurzivní výpočet Fibonacciho posloupnosti. Pro tuto posloupnost platí:

Úkol 4: rychlejší výpočet Fibonacciho posloupnosti

Předchozí řešení je pomalé pro výpočet větších $n$. Důvodem je, že při rekurzivním volání dochází často k opakovanému výpočtu stejných členů posloupnosti.

Řešením je zapamatovat si již vypočítané hodnoty a ty použít:

Napište funkci fibFast(n) pro zrychlený výpočet Fibonacciho posloupnosti

Úkol 5: hanojské věže

Máme tři věže (označme je $A$,$B$ a $C$), na kterých je rozmístěno $n$ disků o různých velikostech. Vždy platí, že menší disk smí být položen na větší disk, ne naopak. Na začátku je všech n disků na věži $A$, přičemž jsou seřazeny podle velikosti (největší leží dole, nejmenší nahoře). Cílem je přemístit disky tak, aby všechny ležely na věži $C$.

Úkol 6: třídění karet

Uvažujme hrací karty .

Napište funkci, který vzestupně třídí karty podle jejich barvy a podle jejich hodnoty.

cards = [  [3,"A"],  [3,"Q"],  [0,"2"],  [1,"10"]  ]

výsledek pro setřídění:

[  [0, "2"],  [1, "10"],  [3, "Q"],  [3, "A"]  ]

Seřaďte toto pole:

cards = [[0, 'Q'], [2, '10'], [1, 'K'], 
         [1, '8'], [2, '10'], [2, '4'], 
         [3, '4'], [0, '4'], [1, '3'], 
         [2, '5'], [0, 'K'], [3, '4'], 
         [1, 'J'], [0, '3'], [0, '9']]

domácí příprava

Expanze polynomu

Napište funkci, která vypíše expanzi polynomu $(x+y)^n$.

Determinant matice

$ \det \mathbf {A} =\sum _{j=1}^{n}\ {a}_{ij}{C}_{ij}$ kde $ {C}_{ij}$ jsou kofaktory, tedy $ {C}_{ij}$ je $ (-1)^{i+j}$ krát determinant matice, která vznikne z A odstraněním i-tého řádku a j-tého sloupce.

domácí práce

Lehká varianta

Například pro vstup:

7
1.577

program vytiskne:

4.24302193

Těžká varianta

Příklad I Vstup:

1
2
0
Výstup:
[]([])
()[][]
[[]]()
[][]()
()[[]]
[()][]
([])[]
[[()]]
[()[]]
[([])]
[[]()]
([[]])
[][()]
([][])
[]()[]

Příklad II. Vstup

1
1
1
program vytiskne (ukazujeme pouze prvních 15 řádků, délka úplného řešení pro vstup (1, 1, 1) je 30):
([{}])
([]{})
([]){}
({[]})
({}[])
({})[]
()[{}]
()[]{}
(){[]}
(){}[]
[({})]
[(){}]
[()]{}
[{()}]
[{}()]
...