Transcript Rekurzija

Python
rekurzija
Pesmica
Živel je mož, imel je psa, lepo ga je učil.
Nekoč ukradel mu je kos mesa, zato ga je ubil.
Postavil mu je spomenik in nanj napisal:
Živel je mož, imel je psa, lepo ga je učil.
Nekoč ukradel mu je kos mesa, zato ga je ubil.
Postavil mu je spomenik in nanj napisal:
Živel je mož, imel je psa, lepo ga je učil.
Nekoč ukradel mu je kos mesa, zato ga je ubil.
Postavil mu je spomenik in nanj napisal:
Živel je mož, imel je psa, lepo ga je učil.
Nekoč ukradel mu je kos mesa, zato ga je ubil.
Postavil mu je spomenik in nanj napisal:
Živel je mož, imel je psa, lepo ga je učil.
Nekoč ukradel mu je kos mesa, zato ga je ubil.
Postavil mu je spomenik in nanj napisal:
Živel je mož, imel je psa, lepo ga je učil.
Nekoč ukradel mu je kos mesa, zato ga je ubil.
Postavil mu je spomenik in nanj napisal:
Živel je mož, imel je psa, lepo ga je učil.
Nekoč ...
2
Zgodba
Bila je temna, nevihtna noč ... Ladjo so valovi
premetavali naprej in nazaj, veter je zavijal
med jadri in dež se je zlival na palubo.
Posadka je bila zbrana ob petrolejki. Vsi so se
zavijali v odeje in trepetali, ko je kapitan
pričel pripovedovati zgodbo:
"Bila je temna, nevihtna noč ..."
3
Slika v sliki
4
Problemi
5
Problemi
Izračunaj volumen telesa, preluknjanega n-krat
Poišči največje in najmanjše število v tabeli števil
Uredi podatke po velikosti.
Izračunaj produkt naravnih števil od 1 do n.
6
Problemi
Izračunaj yn s čim manj množenji.
Hanoiski stolpiči
7
REKURZIJA
Različni problemi
Naloga:
Sestavi navodila (postopek), s katerim bi problem
rešil
Navkljub različnosti:
Skupni prijem: rekurzija
8
REKURZIJA
V Slovarju slovenskega knjižnega jezika SSKJ ni
besede rekurzija, pojavlja pa se beseda rekurz
-a m (u) knjiž. vrnitev (na kako stvar, dejstvo): rekurz na že omenjana
dognanja ni potreben / v njegovih romanih so pogosti rekurzi v preteklost
(tudi v filmih je tega precej)
rekurirati -am dov. in nedov. (i) knjiž. vrniti se (na kako stvar,
dejstvo): pogosto rekurirati na nekatera dejstva, spoznanja
9
REKURZIJA
V Velikem slovarju tujk je dana definicija
rekurzije (iz latinščine recurrere iti nazaj, vrniti
se):
definiranje funkcije ali postopka s samim seboj
(informatika)
izvajanje veličine ali funkcije, ki jo je treba šele
definirati na že znano veličino (matematika).
Označuje tudi zaporedje, katerega n-ti člen je
določen z enim ali več predhodnimi členi.
10
REKURZIJA
Tudi v vsakdanjem življenju srečamo rekurzijo.
Definicija prednika neke osebe je lahko:
prednik osebe je eden od roditeljev osebe
(osnovni primer)
prednik pa je tudi tudi roditelj kateregakoli
prednika (rekurzivni primer)
11
REKURZIJA
Rekurzivna slika, na kateri je rekurzivna slika, na kateri je rekurzivna slika, na kateri ...
12
Rekurzija
13
Rekurzija
Po računalniško:
Postopek, ki je definiran (določen, opisan)
sam s sabo.
14
Rekurzija
Rešitev problema – podana s samim problemom, le
nad manjšim obsegom podatkov
V opisu postopka rešitve uporabimo kar ta postopek
Če želimo priti do rešitve, ne moremo nadaljevati v
nedogled kot npr. pri pesmici
ustavitveni pogoj:
Kdaj v postopku ne uporabimo istega postopka
Običajno: ko je problem "majhen" (enostaven)
15
REKURZIJA
Različni problemi
Naloga:
Sestavi navodila (postopek), s katerim bi problem rešil
Splošni algoritem:
Če je problem majhen, vrni rešitev
Sicer pa
Razdeli problem na manjše podprobleme iste vrste, kot je
prvotni problem
Z klicem istega algoritma (rekurzija) pridobi rešitve vseh
podproblemov
Združi rešitve podproblemov v enotno rešitev
16
Faktoriela
7! = 1 * 2* 3 * 4 * 5 * 6 * 7
3! = 6
Zelo hitro naraščajoča zadeva
3! = 6
5! = 120
42! = 1405006117752879898543142606244511569936384000000000
Rekurzivna definicija: n! = n * (n-1)!
n! bomo izračunali, če bomo poznali (n-1)!
3! = 3 * 2!
2! = 2 * 1! =
1! = 1 * 0! =
0! = 0 * (-1)! = ???
1! = 1
17
Faktoriela - postopek
Faktoriela(n):
Če je n = 1, je rezultat 1
sicer pa
pom = faktoriela(n – 1)
rezultat = n * pom
18
Faktoriela
1! = 1
n! = n * (n-1)!
def faktoriela(n) :
if n == 1 :
return 1
else :
doNm1 = faktoriela(n-1)
rez = n * doNm1
return rez
print("4! = " + str(faktoriela(4)))
19
Faktoriela
Rekurzivno reševanje faktoriele
20
yn
n je potenca števila 2 (denimo 16)
y16 = y y y y y y y y y y y y y y y y .... 15
množenj
y16 = y8 y8
y8 = y4 y4
y4 = y 2 y2
y2 = y y
.................... 4 množenja
21
yn
Kaj pa, če n npr.14
y14 = y7 y7
y7 = y 6 y
y6 = y 3 y3
y3 = y 2 y
y2 = y y ......... 5 množenj
22
yn
if n == 2 :
return y * y
else :
pom = pot(y, n // 2)
return pom*pom
če ni potenca 2
if n == 1 :
return y
else :
pom = pot(y, n // 2)
if n % 2 == 0 :
return pom * pom
else :
return y * pom * pom
23
Kaj je torej rekurzija
Kako je v slovarju definirana beseda
'rekurzivno' ?
Piše: Glej 'rekurzivno'.
24
Hanoiski stolpiči
Problem Hanoiskih stolpičev:
25
Hanoiski stolpiči
26
Hanoiski stolpiči - prikaz
27
Hanoiski stolpiči -ideja
prestavi n-1 obročev z A na B (s pomočjo C)
28
Hanoiski stolpiči -ideja
Daj obroč z A na C
Prestavi n –1 obročev z B na C (s pomočjo A)
29
Hanoiski stolpiči
Preloži n obročev z A na C s pomočjo B
Preloži n-1 obročev z A na B s pomočjo C
Daj obroč z A na C
Preloži n-1 obročev z B na C s pomočjo A
ustavi ?
30
Hanoiski stolpiči
Preloži n obročev z A na C s pomočjo B
Če je n = 1 potem daj obroč z A na C
sicer pa
Preloži n-1 obročev z A na B s pomočjo C
Daj obroč z A na C
Preloži n-1 obročev z B na C s pomočjo A
31
Hanoiski stolpiči
# n obročev z A na C s pomočjo B
Hanoi(n, A, B, C)
Če je n = 1 potem daj obroč z A na C
sicer pa
Hanoi(n-1, A, C, B)
Daj obroč z A na C
Hanoi(n-1, B, A, C)
32
Hanoiski stolpiči
def hanoi (n, st1, st2, st3) :
if n == 1 :
print("Preloži z", st1,"na", st3)
else :
hanoi(n-1, st1, st3, st2)
print("Preloži z", st1,"na", st3)
hanoi(n-1, st2, st1, st3)
33
Hanoi
hanoi(3, "A", "B", "C")
hanoi(2, "A", "C", "B")
hanoi(1, "A", "B", "C")
izpis: Preloži z A na C
izpis: Preloži z A na B
hanoi(1, "C", "A", "B")
izpis: Preloži z C na B
izpis: Prelozi z A na C
hanoi(2, "B", "A", "C")
hanoi(1, "B", "C", "A")
izpis: Preloži z B na A
izpis: Preloži z B na C
hanoi(1, "A", "B", "C")
izpis: Preloži z A na C
34
Črta dobi mozolje
Zvečer je bila črta še čisto normalna. Lepo
gladka je potekala od točke A do točke B.
A zjutraj se je zbudila s čudnim občutkom.
Odtavala je pred ogledalo in groza! Ni bila več
lepo gladka. Nad njeno srednjo tretjino se je
bohotil mozolj.
Ampak kakšen – špičast, trikoten z robovi kar
take dolžine, kot je bila prej dolžina srednje
črte.
35
Črta dobi mozolje
In naslednji dan …
Proces se ni ustavil!
In po 4 dneh
36
Čudežna krema
Končno ji je njena najboljša prijateljica,
krožnica, povedala za čudovito kremo!
Če se namaže z njo po vsakem delčku svoje
kože, bo rast mozoljev vsaj ustavljena.
A krema je draga ...
In za vsak cm potrebuje črta vsaj 6g te kreme.
Koliko jo mora kupiti, če je bila na začetku
dolga d in je preteklo že n dni, kar je dobivala
mozolje?
37
Neprijeten pogled na črtino kožo
38
Ideja
Črta je po 4 dneh taka, kot bi vzeli 4 take črte
med A' in B', kakršne so bile po treh dneh.
A' in B' pa sta na tretjini razdalje med A in B
39