390 likes | 547 Views
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.
E N D
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č ...
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č ..."
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.
Problemi • Izračunaj yn s čim manj množenji. • Hanoiski stolpiči
REKURZIJA • Različni problemi • Naloga: • Sestavi navodila (postopek), s katerim bi problem rešil • Navkljub različnosti: • Skupni prijem: rekurzija
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
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.
REKURZIJA • Tudiv vsakdanjemživljenjusrečamorekurzijo. • Definicijaprednikanekeosebe je lahko: • prednikosebe je edenodroditeljevosebe (osnovni primer) • prednik pa je tuditudiroditeljkateregakoliprednika (rekurzivni primer)
REKURZIJA Rekurzivna slika, na kateri je rekurzivna slika, na kateri je rekurzivna slika, na kateri ...
Rekurzija • Po računalniško: • Postopek, ki je definiran (določen, opisan) sam s sabo.
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)
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
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
Faktoriela - postopek • Faktoriela(n): • Če je n = 1, je rezultat 1 • sicer pa • pom = faktoriela(n – 1) • rezultat = n * pom
Faktoriela • 1! = 1 • n! = n * (n-1)! deffaktoriela(n) : if n ==1 : return 1 else : doNm1 = faktoriela(n-1) rez = n * doNm1 return rez print("4! = " + str(faktoriela(4)))
Faktoriela Rekurzivno reševanje faktoriele
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 = y2 y2 • y2 = y y • .................... 4 množenja
yn • Kaj pa, če n npr.14 • y14 = y7 y7 • y7 = y6 y • y6 = y3 y3 • y3 = y2 y • y2 = y y ......... 5 množenj
yn • if n == 2 :return y * yelse : pom = pot(y, n // 2)return pom*pom • če ni potenca 2 • if n == 1 :return yelse : pom = pot(y, n // 2) if n % 2 == 0 : return pom * pomelse :return y * pom * pom
Kaj je torej rekurzija • Kako je v slovarju definirana beseda 'rekurzivno' ? • Piše: Glej 'rekurzivno'.
Hanoiski stolpiči • Problem Hanoiskih stolpičev:
Hanoiski stolpiči -ideja prestavi n-1 obročev z A na B (s pomočjo C)
Hanoiski stolpiči -ideja Dajobroč z A naC Prestavi n –1 obročev z B na C (s pomočjo A)
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 ?
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
Hanoiski stolpiči # n obročev z A na C s pomočjo B Hanoi(n, A, B, C) Če je n = 1 potemdajobroč z A na C sicer pa Hanoi(n-1, A, C, B) Dajobroč z A na C Hanoi(n-1, B, A, C)
Hanoiski stolpiči defhanoi(n, st1, st2,st3): if n ==1 : print("Preložiz", st1,"na", st3) else : hanoi(n-1, st1, st3, st2) print("Preložiz", st1,"na", st3) hanoi(n-1, st2, st1, st3)
Hanoi • hanoi(3, "A", "B", "C") • hanoi(2, "A", "C", "B") • hanoi(1, "A", "B", "C") • izpis: Preložiz A na C • izpis: Preložiz A na B • hanoi(1, "C", "A", "B") • izpis: Preložiz C na B • izpis: Prelozi z A na C • hanoi(2, "B", "A", "C") • hanoi(1, "B", "C", "A") • izpis: Preložiz B na A • izpis: Preložiz B na C • hanoi(1, "A", "B", "C") • izpis: Preložiz A na C
Č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.
Črta dobi mozolje • In naslednji dan … • Proces se ni ustavil! • In po 4 dneh
Čudežna krema • Končnoji je njenanajboljšaprijateljica, krožnica, povedalazačudovitokremo! • Če se namaže z njopovsakemdelčkusvojekože, borastmozoljevvsajustavljena. • A krema je draga ... • In zavsak cm potrebuječrtavsaj 6g tekreme. • Kolikojomorakupiti, če je bilanazačetkudolgad in jepreteklože n dni, kar je dobivalamozolje?
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