You are on page 1of 4

Literatura:

-Mari-Janii;
-Prezentacije (moodle);
-Milo Tomaevi : Algoritmi i strukture podataka;
-Internet;
Plan aktivnosti u semestru:
Od 1.do 8.sedmice P/A/L, u 9.sedmici 1.kolokvijum. Od 10.do 14.sedmice P/A/L, a u
15.sedmici 2.kolokvijum (6.juni).
Ocjenjivanje:
-Laboratorija:
-Kolokvijum I:
-Kolokvijum II:
-Zavrsni ispit:

0-15 bodova;
0-20 bodova (mora biti preko 40%);
0-25 bodova (mora biti preko 40%);
0-40 bodova (mora biti preko 50%);

Predavanje I:
Rekurzija:
Rekurzivna funkcija je funkcija koja poziva samu sebe. 2 su osnovna elementa svake
rekurzije:
1) Bazni ili osnovni sluaj (moe imati vise osnovnih sluaja)(zaustavljanje
funkcije);
2) Rekurzivni korak (nain na koji se funkcija iznova poziva, tako to onaj
sloeniji problem svodi na rjeavanje jednostavnijeg);
Primjer:
x^n={1, n=0 (bazni ili osnovni sluaj);
Primjer, rekurzivna definicija faktorijela:
n!=1*2**n (nerekurzivno ili iterativno)
n!={1, n<=1; n*(n-1)!, n>1
Primjer, rekurentna formula:
Xn=2*Xn-1+3*Xn-2, i bitno je koliko je X0 i X1
Implementacija u C:
Iz primjera x^n:
double stepenovanje(double x, int n)
{
if (n==0)
return 1;
else

n>0, x*x^(n-1) (rekurzivni korak);

return x*stepenovanje(x,n-1);
}
Program:
#include <stdio.h>
double stepenovanje(double x, int n)
{
if (n==0)
return 1;
else
return x*stepenovanje(x,n-1);
}
int main ()
{
printf(2^3= %.2lf\n, stepenovanje(2,3));
return 0;
}
Nain rada prethodno napisane funkcije:
stepenovanje (2,3)
x=2
n=3 > 0 => return 2*stepenovanje(2,2);
Zatim
x=2
n=2 > 0 => return 2*stepenovanje(2,1);
Zatim
x=2
n=1 > 0 => return 2*stepenovanje(2,0);
Zatim
x=2
n=0 => return 1 ;
Proces rada je da se return zadnji vraa prethodnom, redom 2*1, zatim 2*2*1, zatim 2*2*2*1
i to je rezultat.
Proces izvravanja rekurzije:
Sve sto vai za funkcije vai i za rekurzivne. Izvrsni kod je u segment kodu.
Iz prethodnog primjera:
stepenovanje (2,3)
Odozgoo raste stek
Na steku se ostavlja 2 i 3(koja je konvencija pozivanja, zavisi redoslijed njihovog stavljanja
na stek.
Na stek se prvo stavlja 3, odnosno n. Zatim se na stek stavlja 2, odnosno x. Zatim se stavlja
adresa povratka u main() Ovo do sada je kada se udje u funkciju stepenovanje. Ovaj dio
do sada napisan je stek okvir prve funkcije za stepenovanje.

Zatim ide poziv funkcije stepenovanje (2,2). Ide n, zatim x, zatim adresa povratka u
stepenovanje. Ovo je stek okvir 2.stepenovanje funkcije.
I tako dalje. Vracanje poslednje funkcije u prethodnu ona se skida sa steka.
Zatim poslednja funkcija vraca rezultat u main() i brise se.
Heap, dinamika memorija
Data segment stringovi, statike promjenjive
Main() stepenovanje (njihov kod), segment koda Adrese odozdo rastu
1) Zato rekurzija mora da konvergira?
Mora da ide prema jednostavnom sluaju. Ona na stek ostavlja svaki poziv funkcije,
sve dok se ne potroi, odnosno dok ima steka, za razliku od beskonane petlje koja ne
troi memoriju, samo procesorsko vrijeme (for (;;);). Znai pro
2) Zato mora da postoji sliaj za zaustavljanje rekurzije?
Mora da prekine da bi se omoguilo novo zauzimanje steka.
Dobre i loe strane rekurzije:
Kod je kratak, lako se ita, svodi se program na jednostavnije, lako se odrava i lako se
ispravlja. Loe strane su cijena poziva (svaki novi poziv nove funkcije je troenje memorije
steka i usporavanje (ako na stek treba da iskopirate argumente... mi smo time potrosili
vrijeme, nekoliko memorijskih ciklusa). Dolazi do poveanja vremenske i prostorne
sloenosti. Jo jedna strana loa, a to su suvina izraunavanja ili izvravanja. Moe se desiti
da kroz izvrsavanje desi da ste vec neto izvravali.
Primjer suvinog izvravanja, Fibonaijev niz: 1 1 2 3 5 8 13 21 34...
f(n)={1, n<=2; f(n-1)+f(n-2), n>2
Implementacija prethodne rekurzije:
int fibonaci(int n)
{
if (n<=2) return 1;
else
return fibonaci(n-1)+fibonaci(n-2);
}
Ako hoemo da nadjemo 4.clan:
fibonaci(2)+fibonaci(3)
n=2 => return 1; n=3 => fibonaci(1)+fibonaci(2)
n=1 => return 1; n=2 => return 1;
Tehnike za eliminaciju suvinih izvravanja:
1) Memoizacija je tehnika kojom se u odgovarajucoj strukturi podataka pamte
vrijednosti za razliite elemente. Odnosno ona za odgovarajue vrijednosti
argumenata provjerava da li ima izraunato ve. Ako postoji, vraa taj rezultat, ako
ne, rauna.
Modifikacija Fibonaijevog niza sa memoizacijom:

int fibonaci(int n)
{
static int memo[MAX]={0,1,1};
if (memo[n]!=0) return memo[n];
else
return memo[n]=fibonaci(n-1)+fibonaci(n-2);
}
Hanojske kule:
prebaci(n, sa, na, peko);
void prebaci(int n, char SA, char NA, char PREKO)
{
if (n==1)
printf(%c -> %c\n, SA, NA);
else
{
prebaci(n-1,SA , PREKO, NA);
printf(%c -> %c\n, SA, NA);
prebaci(n-1, PREKO, NA, SA);
}
}

You might also like