rekurzija

4
Gradivo III razreda u Gimnaziji "Veljko Petrović" računarstvo i informatika Rekurzija Pojam rekurzije Na latinskom, re- = nazad + currere = znači izvršavati, dešavati se iznova. U matematici, rekurzija je takav algoritam, odnosno notacija ili pravilo opisa objekta, u čijim se definicijama kao parametar ili argument pojavljuju (i) sami objekti. Rekurzija u matematici omogućuje kompaktno definisanje proizvoljno velikog skupa vrednosti objekata minimalnim skupom izjava. Recimo: sa samo dve izjave definišemo skup prirodnih brojeva. 1 je prirodan broj. ako je n (n>1) prirodan broj, onda je i n+1 prirodan broj. U programiranju označava situaciju kada procedura ili funkcija poziva sama sebe. tj. kada se u definiciji funkcije, rekurzivno, kao parametar, javlja ista funkcija, jednom ili više puta, ali s drugoim vrednostima argumenta, Međutim to nije jedini slučaj. Postoji i uzajamno pozivanje dve (ili više) funkcije kada funkcija f() poziva funkciju g() a ova opet poziva funkciju f(), i tako ponovo. U programskim jezicima, rekurzivni algoritmi implementirani su kao podprogrami (procedure ili funkcijski podprogrami) radi mogućnosti rekurzivnog pozivanja. PASCAL je jedan od nekoliko programskih jezika visokog nivoa u kojima je dopušteno opisivanje i izračunavanje rekurzivnim algoritmima. Razumevanje rekurzije Da bi ste shvatili rekurziju, prvo morate shvatiti rekurziju! Humor se ovde krije u igri reči, i to iz dva razloga. Prvo rekurzivne funkcije su one koje pozivaju same sebe, pa otud shvatanje rekurzije zavisi id shvatanja rekurzije. Drugo činjenica je da je rekurziju teško razumeti, i izgleda da je neki ljudi shvataju a neki ne. Ovo poslednje ne treba prihvatiti kao stanje koje se ne može popraviti. Shvatanje rekurzije nije nemoguće ako sledite nekoliko sledećih jednostavnih uputstava. Osnova shvatanje rekurzije je prvo u tome, da shvatite kako rešiti problem za jedan nivo jednostavniji, i drugo, da naučite kao da pratite rekurzivnu funkciju. Praćenje je neverovatno korisno kada ste početnik u savladavanju rekurzivnih poslova. Učenici veruju da funkcija poziva sama sebe, što dovodi do nepredvidivih tokova misli i skretanja spravog puta. Oni u glavnom ne shvataju da kad funkcija poziva sama sebe, ona se u stvari ponaša potpuno isto kao kad poziva drugu funkciju. Ako niste u stanju da pravilno pratite rekurziju, teško da možete verovati da ona radi ispravno.

Upload: aldina

Post on 20-Nov-2015

9 views

Category:

Documents


0 download

DESCRIPTION

Rekurzivne funkcije u Pascalu

TRANSCRIPT

Gradivo III razreda u Gimnaziji "Veljko Petrovi"raunarstvo i informatikaRekurzijaPojam rekurzijeNa latinskom, re- = nazad + currere = znai izvravati, deavati se iznova.U matematici, rekurzija je takav algoritam, odnosno notacija ili pravilo opisa objekta, u ijim se definicijama kao parametar ili argument pojavljuju (i) sami objekti.Rekurzija u matematici omoguuje kompaktno definisanje proizvoljno velikog skupa vrednosti objekata minimalnim skupom izjava. Recimo: sa samo dve izjave definiemo skup prirodnih brojeva. 1 je prirodan broj. ako je n (n>1) prirodan broj, onda je i n+1 prirodan broj.U programiranju oznaava situaciju kada procedura ili funkcija poziva sama sebe. tj. kada se u definiciji funkcije, rekurzivno, kao parametar, javlja ista funkcija, jednom ili vie puta, ali s drugoim vrednostima argumenta, Meutim to nije jedini sluaj. Postoji i uzajamno pozivanje dve (ili vie) funkcije kada funkcijaf()poziva funkcijug()a ova opet poziva funkcijuf(), i tako ponovo.U programskim jezicima, rekurzivni algoritmi implementirani su kao podprogrami (procedure ili funkcijski podprogrami) radi mogunosti rekurzivnog pozivanja. PASCAL je jedan od nekoliko programskih jezika visokog nivoa u kojima je doputeno opisivanje i izraunavanje rekurzivnim algoritmima.Razumevanje rekurzijeDa bi ste shvatili rekurziju, prvo morate shvatiti rekurziju!Humor se ovde krije u igri rei, i to iz dva razloga. Prvo rekurzivne funkcije su one koje pozivaju same sebe, pa otud shvatanje rekurzije zavisi id shvatanja rekurzije. Drugo injenica je da je rekurziju teko razumeti, i izgleda da je neki ljudi shvataju a neki ne.Ovo poslednje ne treba prihvatiti kao stanje koje se ne moe popraviti. Shvatanje rekurzije nije nemogue ako sledite nekoliko sledeih jednostavnih uputstava. Osnova shvatanje rekurzije je prvo u tome, da shvatite kako reiti problem za jedan nivo jednostavniji, i drugo, da nauite kao da pratite rekurzivnu funkciju.Praenje je neverovatno korisno kada ste poetnik u savladavanju rekurzivnih poslova. Uenici veruju da funkcija poziva sama sebe, to dovodi do nepredvidivih tokova misli i skretanja spravog puta. Oni u glavnom ne shvataju da kad funkcija poziva sama sebe, ona se u stvari ponaa potpuno isto kao kad poziva drugu funkciju.Ako niste u stanju da pravilno pratite rekurziju, teko da moete verovati da ona radi ispravno.ta je ironija: kada ispratite rekurzivnu funkciju nekoliko puta (recimo 10 do 20 puta na razliitim sluajevima), tada poinjete verovati poslu koji obavlja rekurzija, i odjednom vie ne pratite rekurzivni kod, sem u sluaju kad ga morate dibagirati.Veina ljudi prolazi tri faze u procesu uenja rekurzije.Prvo, oni je mrze, jer ne mogu da je razumeju.Zatim, je vole jer su razumeli ovaj misteriozni proces.I na krajuponovo je mrze jer misle da je neefikasna. Naroito zato to rekurzivna reenja zahtevaju barO(n)memorije, dok iterativna daju reenja uO(1)prostora. Ipak za mnoge probleme kod kojih memorijski prostor nije velika briga, rekurzija daje jednostavna reenja, lak za praenje.

Rekurzivni problemiMnogi problemi se mogu i reiti rekurzivno, npr. igre svih tipova od jednostavnih kao to su problem Hanojskih kula do sloenih, kao sto je ah. U igrama, rekurzivna reenja su naroito pogodna kada zakljuite da konano reenje zavisi od reenja koje je za jedan (ili nekoliko) korak manje.Rekurzivni, kao i svaki drugi algoritam, mora biti okarakterisan sledeim osobinama:1. da je opisan u konanom broju koraka, i2. da se izraunavanje vriednosti zavri nakon konanog broja izraunavanja.Dok je prvu osobinu relativno jednostavno ostvariti, za ostvarenje druge osobine potrebno je uvesti tvz. uslov zavretka. Ako se rekurzivni algoritam posmatra kao funkcija jednog ili vie argumenata, kaemo da e se izraunavanje vrednosti po tom algoritmu zavriti ako se pri svakom pozivu rekurzivne funkcije bar jedna od izraunatih vrednosti pribliava uslovu zavretka.Mnoge matematike funkcije se mogu definisati rekurzivno: Faktorijel Fibonaijevi brojevi Odreivanje NZD po euklidovom algoritmu (najvei zajedniki delilac)Uslov zavretka je ekstremno vaan kada radimo sa rekurzivnim funkcijama. Ako se izostavi, ili pogreno odredi, tada e funkcija nastaviti da poziva samu sebe sve dok program ne popuni ceo stek poziva tj. ne potroi svu slobodnu memoriju! Naravno u tom sluaju rezultati su neupotrebljivi.Nedostatak ispravnog uslova prekida u rekurzivnoj funkciji je uvek katastrofalan!Pri upotrebi globalnih promenljivih unutar geklaracije koda rekurzivnih funkcija, takoe treba biti oprezan.Strukture podataka se takoe mogu rekurzivno definisati. Jedna od najvanijih klasa struktura - stabla - dozvoljavaju rekurzivne definicije koje vode do jednostavnih (i efikasnih) rekurzivnih funkcija za njihovu obradu. Isto vai i za grafove. Sa rekurzijom emo se sresti i kod sortiranja nizova pomouquick-sortalgoritma.

Primer 1 - FaktorijelNapisati program koji izraunava n! ako se unosi prirodan broj n sa tastature.{ dve su stvari presudne: 1. 0! = 1. - imamo kriterijum zavretka. 2. n! = n * (n-1)! - zavisnost problem od jednostavn. za korak.}Var n:integer;Function Faktorijel(x:integer):longint;Begin if x = 0 then Faktorijel := 1 else Faktorijel := x * Faktorijel(x-1);End;Begin Write('Unesite prirodan broj n = '); Readln(n); Writeln('N faktorijel iznosi : ', Faktorijel(n));End.

Primer 2 - Fibonaijevi brojeviNapisati program koji izraunava niz fibonaijevih brojeva ako se unosi prirodan broj n sa tastature.{ za razliku od preth. primera, ovde imamo tri krine stvari: 1. fib(0) = 1 - imamo jedan krit. zavretka, 2. fib(1) = 1 - imamo drugi krit. zavretka, 3. fib(n) = fib(n-1) + fib(n-2) - problem zavisi od dva jednost.: prethodnog i pretprethodnog.}Var n:integer;Function Fibonaci(x:integer):longint;Begin if (x = 0) or (x = 1) then Fibonaci := 1 else Fibonaci := Fibonaci(x-1) + Fibonaci(x-2);End;Begin Write('Unesite prirodan broj