Vaje - Nauk.si

Download Report

Transcript Vaje - Nauk.si

Python - rekurzija
Nekaj vaj
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
2
Vsota
n
n 1
i 1
i 1
i ni
vsota(n) = n + vsota(n-1)
--------------ustavitveni pogoj.
1
i 1
i 1
Oziroma
vsota(1) = 1;
3
Kaj je kaj
Oglej si naslednji rekurzivni program:
Puzzle(base, limit) :
#base in limit sta nenegativni števili
if base > limit :
return -1
else :
if base == limit :
return 1
else :
return base * Puzzle(base + 1, limit)
Kateri del metode Puzzle je ustavitveni pogoj?
Kje se izvede rekurzivni klic?
Kaj izpišejo sledeči stavki:
Puzzle(14,10)
Puzzle(4,7)
Puzzle(0,0)
4
Osnove rekurzije
Dana je rekurzivna metoda. Preberi jo in ugotovi, kaj
dela. Šele potem!! jo prenesi v testni program in
zaženi ter preveri, da res dela tisto, kar si si
predstavljal.
KajDelam(stevec) :
if(stevec <= 0) :
return ""
else :
return "" + str(stevec) + ", " +
KajDelam(stevec - 1)
Metodo nato prepiši tako, da bo vrnila niz s števili v
obratnem vrstnem redu kot prvotna.
5
Obrni niz
Napiši funkcijo, ki s pomočjo rekurzije vrne obrnjeni niz.
Ideja:
Matija – M + atija
Obrnjeni niz dobimo tako, da 'M' dodamo na konec obrnjenega niza
atija!
In kako dobimo obrnjeni niz 'atija' – z istim postopkom!
Ustavitveni pogoj?
Ideja 2:
Obrnjeni niz dobimo tako, da 'a' dodamo na začetek obrnjenega niza
'Matij'
Ideja 3:
Niz razdelimo na pol, obrnemo vsako polovico in staknemo dobljena
niza
6
Min-Max
Dan imamo seznam celih števil. Radi bi sestavili rekurzivno metodo
MinMax(števila), ki vrne dva elementa: minimalni element seznama
števila in maksimalni element seznama števila.
Ideja:
seznam razpolovimo
poiščemo min/max prvega dela (prvih pol elementov)
poiščemo min/max drugega dela (druga polovica elementov)
na podlagi min/max obeh delov poiščemo min/max celotne tabele
Npr.:
Naj bo seznam [23, 4, 546, 56, 776, 8]
Poiščemo min/max [23, 4, 546] --- 4 in 546
Poiščemo min/max [56, 776, 8] --- 8 in 776
Odgovor za cel seznam je 4 in 776
7
Palindrom
S pomočjo rekurzije preveri, če je niz palindrom.
Niz je palindom, če velja:
Prvi znak je enak zadnjemu
Vsi znaki brez prvega in zadnjega so tudi palindromski niz
Različica naloge:
Dan je seznam. S pomočjo rekurzije preveri, če je "palindromski". Npr. [1, 3,
3, 1] je palindromski seznam
Različica naloge:
Dan je seznam nizov. Preveri, če je dvojno palindromski. To pomeni, da je kot
seznam palindromski in da so tudi nizi, ki ga sestavljajo, palindromi.
Različica naloge:
Dan je seznam števil. Preveri, če je dvojno palindromski. To pomeni, da je kot
seznam palindromski in da so tudi števila, ki ga sestavljajo, palindromska.
Število je palindromsko, če se z leve bere enako kot z desne.
8
Kochova snežinka - ploščina
Na sliki je Kochova snežinka stopnje 4
To lepo snežinko lahko dobimo z naslednjim postopkom.
Stopnja 0 kar enakostranični trikotnik. Pri vsaki stranici, podobno kot pri
Kochovi črti, srednji del nadomestimo z enako dolgima stranicama, da
tvorijo navidezni enakostranični trikotnik.
9
Urejanje z zlivanjem
Seznam števil lahko uredimo po naslednjem
postopku:
Razdelimo ga na pol na dva seznama.
Oba dobljena seznama uredimo z enakim
postopkom (rekurzivna klica).
Dobljena urejena seznama združimo v novega,
prav tako urejenega s postopkom, ki mu rečemo,
zlivanje.
10
Zlivanje – različice besedila naloge
Dan je nek niz. Naredi nov seznam, ki vsebuje enake znake kot prvotni niz, le da so
urejeni po abecedi.
Namesto, da urejaš od najmanjšega do največjega, uredi od največjega do
najmanjšega (bodisi seznam, bodisi niz).
Dan je seznam seznamov. Uredi ga tako, da bodo seznam urejen glede na dolžino
seznamov, ki nastopajo v njem.
Dan je seznam nizov. Uredi ta seznam glede na dolžino nizov.
Dan je seznam seznamov števil. Uredi ga tako, da bodo seznam urejen po dolžini
seznamov, "notranji" seznami pa bodo imeli elemente urejene po velikosti.
Dan je seznam seznamov števil. Uredi ga tako, da bodo seznam urejen tako,da
bodo najprej tisti seznami, ki imajo najmanjše elemente, "notranji" seznami pa
bodo imeli elemente urejene po velikosti.
Dan je seznam seznamov števil. Uredi ga tako, da bodo "notranji" seznami imeli
elemente urejene po velikosti, celotni seznam pa bo urejen "leksikografsko". Torej
najprej bodo tisti seznami, ki imajo najmanjše elemente, če pa imata dva
seznama enak najmanjši element, primerjamo naslednja dva najmanjša elementa
teh dveh seznamov, …
11
Ploščina Kochove snežinke
Sestavi metodo, ki izračuna ploščino Kochove
snežinke stopnje n in začetno stranico d.
12
Za 13. prosojnico pa se že spodobi malo
"hude" matematike
Fib. zaporedje lahko posplošimo
a0 = a
a1 = b
an = an-1 + an-2
Naloga: določiti n-ti člen posplošenega (a, b sta
parametra!)
Ali pa – vrni seznam vseh prvih n-členom Fib.
zaporedja
"Ve se", da je limita kvocienta zaporednih členov
poljubnega Fibonaccijevega zaporedja zlati rez
((1 + KvKoren(5)) / 2).
Naloga: vrni razmerje n in n+1 – tega člena.
13
Belokranjski vzorci I
Belokranjski vzorci za vezenine stopnje 1, 2, in 3 so
naslednji:
Npr. vzorec stopnje 3 dobimo tako, da poln kvadrat s
stranico a razdelimo na 9 enakih kvadratov. Izrežemo 4
stranske srednje kvadrate. Nato postopek 2x
ponovimo na preostalih 5 kvadratih.
Sestavite funkcijo, ki izračuna, kolikšna je dolžina niti,
ki jo potrebujemo za izdelavo vzorca stopnje n, če za
najmanjše vbode porabimo 3mm niti (za vzorec
stopnje 1 torej porabimo 5 x 4 × 3mm = 60mm).
14