je postopek, ki je opisan sam s sabo.
Rekurzija
je postopek, ki je opisan sam s sabo.
Pomen besede rekurzija 1
Rekurzija v SSKJ (slovar slovenjskega knjižnega jezika) ne obstaja, obstajata pa besedi rekurz in rekurirati:
Pomen besede rekurzija 2
Definicijo rekurzije imamo dano v velikem slovarju tujk (rekurzija iz latinščine recurrere iti nazaj, vrniti se) :
Pomen besede rekurzija 3
Rekurzijo srečamo tudi v vsakdanjem življenju. Definicija prednika neke osebe je lahko:
Pomen besede rekurzija 4
Rekurzijo si lahko predstavljamo tudi z geometrijskimi figurami, ki so določene rekurzivno:
Rekurzivna metoda
V matematiki in računalništvu pomeni rekurzija podajanje metode na tak način, da se v definiciji sklicujemo na isto metodo.
Metodam, ki kličejo samo sebe, pravimo rekurzivne metode. V metodah pogosto uporabljamo parameter, ki se povečuje ali zmanjšuje. Ko dosežemo neko vrednost, je rekurzije konec. Da se rekurzija konča, je vedno potreben ustavitveni pogoj. Ustavitveni pogoj pove, da v postopku ne kličemo metode na manjšem ali večjem problemu. Kot ustavitveni pogoj podamo enostaven, majhen problem. Če le tega ni, se izvajanje metode nikoli ne konča.
Rekurzivna metoda
Lastnosti rekurzivne metode
Vse rekurzivne metode morajo torej imeti naslednje lastnost:
Primer problema - Hanoiski stolpiči
Problem s Hanoiskimi stolpiči je rekurzivni problem, ki temelji na preprosti igri.
Za igro potrebujemo tri palice, na katere nato zlagamo okrogle ploščice različne velikosti. Število ploščic je poljubno, vse pa morajo biti različnega premera.
Cilj igre:
Prestaviti želimo vse ploščice na desno palico z najmanjšim možnim številom potez ob upoštevanju naslednjih pravil:
premaknemo lahko le ploščico, ki je na vrhu ene od palic.
Reševanje problema:
Zapisali bomo rekurzivno metodo, ki bo nam vrnila vrstni red premaikanja ploščic. Tako, da bomo naredili kar se da malo potez.
Metoda bo za parameter prejela število pločic (). Nato pa bomo prestavljali obroče iz prvega stolpca na zadnji stolpec, s pomočjo srednjega stolpca.
Potek reševanja:
Sedaj lahko s pomočjo prvega stolpca premikamo ploščice iz drugega stolpca na zadnji stolpec, pri premikanju največjo ploščico pustimo na dnu stolpca. Sedaj smo prestavili vse ploščice na prvi stolpec, največja ploščica pa je ostala na drugem stolpcu. Tako največjo premaknemo na tretji stolpec.
S takim postopkom nadaljujemo, dokler ne premaknemo še zadnjo ploščico.
Več o Hanoiskih stolpičih si lahko preberete na povezavi: http://sl.wikipedia.org/wiki/Hanojski_stolpi
Rekurzivna rešitev problema
Rekurzivna rešitev problema:
V zgornji metodi metoda kliče samo sebe in to dvakrat. Če imamo problem velikost , v rekurzivnem klicu rešujemo problem . Torej najprej prestavljamo s prvega stolpca na drugi stolpec s pomočjo tretjega stolpca. Nato pa še z drugega stolpca na tretji stolpec s pomočjo prvega.
Primer problema
Podano imamo Fibonaccijevo zaporedje: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... Vsak člen zaporedja (razen prvih dveh) je vsota predhodnjih dveh členov. Označimo splošni n-ti člen tega zaporedja z F(n). Kako dobimo n-ti člen lahko izrazimo rekurzivno:
F(n) = F(n-1) + F(n-2), n = 3, 4, ...
Za začetna člena n = 1, 2 pa imamo poseben pogoj:
F(1) = 1 in F(2) = 1
Rekurzivno definicijsko enačbo lahko uporabimo direktno za izračun določenega člena zaporedja, naprimer za n = 4.
F(4) = F(3) + F(2) = (F(2)+ F(1)) + 1 = (1 + 1) + 1 = 3
Sedaj lahko zapišem rekurzivno metodo int Fibonacci(int n), ki za dani n izračuna in vrne ustrezno Fibonaccijevo število.
Zgornjo definicijo lahko uporabimo v metodi:
Zapis kode v C# na naslednji strani: Koda v C#
Rekurzivna rešitev problema
Rekurzivna rešitev problema:
V zgornji metodi, metoda kliče samo sebe in to dvakrat v stavku
To je rekurzija.
Razlika med iterativno in rekurzivno rešitvijo problema
Rekurzivna rešitev je krajša, enostavnejša in jasnejša. V njej se tudi neposredno zrcali originalna matematična definicija Fibonaccijevega zaporedja in zato je tudi lažje razumljiva. V rekurzivni rešitvi opazimo tudi, da ni potrebna uporaba dodatnih spremenljivk.
Problem pri rekurzivni rešitvi je prostor in čas, ki ga porabi. Rekurzivna metoda traja nekoliko dlje kot iterativna metoda. V primeru (Fibonacci) je rekurzivna metoda še posebaj počasna, saj zahteva več seštevanj kot irerativna metoda.
Prav tako je problem tudi prostor, ki ga porabi. Vsak rekurzivni klic zahteva nekaj prostora. Podatki o rekurzivnem klicu se shranjujejo v pomnilniški sklad in če je globina tega sklada velika, potem je lahko pomnilnik preobremenjen. Torej so rekurzivni programi nekoliko potratnejši od iterativnih programov.
Rekurzija je dobra, toda počasna in lahko zavzame tudi veliko prostora, zato se ji poskušamo izgoniti, če je le mogoče.
Viri