asp 05 rekurzija[3]

42
Algoritmi i Algoritmi i strukture podataka strukture podataka Prof. dr. sc. Damir Kalpić Prof. dr. sc. Vedran Mornar Prof. dr. sc. Krešimir Fertalj Doc. dr. sc. Gordan Gledec Dr. sc. Zvonimir Vanjak Dr. sc. Ivica Botički Dr. sc. Boris Milašinović Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/3.0/hr/

Upload: igor-balic

Post on 16-Apr-2015

50 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: ASP 05 Rekurzija[3]

Algoritmi i strukture podatakaAlgoritmi i strukture podatakaProf. dr. sc. Damir KalpićProf. dr. sc. Vedran MornarProf. dr. sc. Krešimir FertaljDoc. dr. sc. Gordan GledecDr. sc. Zvonimir VanjakDr. sc. Ivica BotičkiDr. sc. Boris Milašinović

Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/3.0/hr/

Page 2: ASP 05 Rekurzija[3]

Creative CommonsCreative Commons

slobodno smijete:slobodno smijete: dijelitidijeliti — umnožavati, distribuirati i javnosti priopćavati djelo — umnožavati, distribuirati i javnosti priopćavati djelo remiksiratiremiksirati — prerađivati djelo — prerađivati djelo

pod sljedećim uvjetima:pod sljedećim uvjetima: imenovanjeimenovanje. Morate priznati i označiti autorstvo djela na način kako je . Morate priznati i označiti autorstvo djela na način kako je

specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše korištenje njegova djela imate njegovu izravnu podršku). korištenje njegova djela imate njegovu izravnu podršku).

nekomercijalnonekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe. . Ovo djelo ne smijete koristiti u komercijalne svrhe. dijeli pod istim uvjetimadijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate . Ako ovo djelo izmijenite, preoblikujete ili stvarate

koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična ovoj. ovoj.

U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava. Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava.

Tekst licencije preuzet je s http://creativecommons.org/.

2 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 3: ASP 05 Rekurzija[3]

RekurzijaRekurzija

Page 4: ASP 05 Rekurzija[3]

Osnovna ideja rekurzijeOsnovna ideja rekurzije

procedura poziva samu sebeprocedura poziva samu sebe mora postojati završetak!mora postojati završetak!

Zašto se dug napravljen kreditnom karticom ne može platiti istom Zašto se dug napravljen kreditnom karticom ne može platiti istom kreditnom karticom?kreditnom karticom?

rekurzivni programi su kraći, ali je izvođenje programa duljerekurzivni programi su kraći, ali je izvođenje programa dulje neki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurzijuneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju

za pohranjivanje rezultata i povratak iz rekurzije koristi se struktura za pohranjivanje rezultata i povratak iz rekurzije koristi se struktura podataka stogpodataka stog

rekurzija:rekurzija:

vidi: rekurzijavidi: rekurzija

rekurzija:rekurzija:

ako nije jasno što je ako nije jasno što je to, vidi: rekurzijato, vidi: rekurzija

4 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 5: ASP 05 Rekurzija[3]

Elementarna rekurzija i sistemski stogElementarna rekurzija i sistemski stog

......

f(1);f(1);

......

void f(int i)void f(int i)

{{

int v;int v;

f(i+1);f(i+1);

return;return;

}}

void f(int i)void f(int i)

{{

int v;int v;

f(i+1);f(i+1);

return;return;

}}

void f(int i)void f(int i)

{{

int v;int v;

f(i+1);f(i+1);

return;return;

}}

void f(int i)void f(int i)

{{

int v;int v;

f(i+1);f(i+1);

return;return;

}}

11pov.adr.pov.adr.

vv

11pov.adr.pov.adr.

vv22

pov.adr.pov.adr.vv

11pov.adr.pov.adr.

vv22

pov.adr.pov.adr.vv33

pov.adr.pov.adr.vv

11pov.adr.pov.adr.

vv22

pov.adr.pov.adr.vv33

pov.adr.pov.adr.vv44

pov.adr.pov.adr.vv

ElementarnaRekurzijaElementarnaRekurzija

mainmain ff f’f’ f’’f’’ f’’’f’’’

5 / 38Algoritmi i strukture podataka, FER, 2010./11.

Page 6: ASP 05 Rekurzija[3]

Izračunavanje faktorijelaIzračunavanje faktorijela

jedan od jednostavnih rekurzivnih algoritama jest izračunavanje jedan od jednostavnih rekurzivnih algoritama jest izračunavanje n!n! za za n >= 0n >= 0 0! = 10! = 1 1! = 11! = 1 n! = n* (n-1)!n! = n* (n-1)!

primjer: 4!primjer: 4!k = fakt (4);k = fakt (4);

= 4 * fakt (3);= 4 * fakt (3);

= 3 * fakt (2);= 3 * fakt (2);

= 2 * fakt (1);= 2 * fakt (1);

= 1 = 1

int fakt(int n){int fakt(int n){

if (n <= 1) {if (n <= 1) {

return 1;return 1;

} else {} else {

return n * fakt(n-1);return n * fakt(n-1);

}}

}}

6 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 7: ASP 05 Rekurzija[3]

Izračuvananje faktorijelaIzračuvananje faktorijela

......

i=fakt(3);i=fakt(3);

......

int fakt(int n){int fakt(int n){

if (n <= 1) {if (n <= 1) {

return 1;return 1;

} else {} else {

return return

n * fakt(n-1);n * fakt(n-1);

}}

}}

33

FaktorijeliFaktorijeli

mainmainint fakt(int n){int fakt(int n){

if (n <= 1) {if (n <= 1) {

return 1;return 1;

} else {} else {

return return

n * fakt(n-1);n * fakt(n-1);

}}

}}

int fakt(int n){int fakt(int n){

if (n <= 1) {if (n <= 1) {

return 1;return 1;

} else {} else {

return return

n * fakt(n-1);n * fakt(n-1);

}}

}}

faktfakt fakt’’fakt’’fakt’fakt’

3322

332211

1122

66

7 / 38Algoritmi i strukture podataka, FER, 2010./11.

Page 8: ASP 05 Rekurzija[3]

Zadaci za vježbuZadaci za vježbu

Napisati funkciju koja prima dva cjelobrojna argumenta Napisati funkciju koja prima dva cjelobrojna argumenta xx i i yy i vraća i vraća preko imena vrijednost preko imena vrijednost xxyy.. PotencijaRekurzijomPotencijaRekurzijom

Poziv funkcije:Poziv funkcije:k = pot(2,5);k = pot(2,5);

= 2*pot(2,4)= 2*pot(2,4)

= 2*pot(2,3)= 2*pot(2,3)

= 2*pot(2,2)= 2*pot(2,2)

= 2*pot(2,1)= 2*pot(2,1)

= 2*pot(2,0)= 2*pot(2,0)

= 1= 1

8 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 9: ASP 05 Rekurzija[3]

Sadržaj stogaSadržaj stoga

pot(2,5)pot(2,5) pot(2,4)pot(2,4) pot(2,3)pot(2,3) pot(2,2)pot(2,2) pot(2,1)pot(2,1) pot(2,0)pot(2,0) returnreturn

11return return

2*12*1return return

2*22*2return return

2*42*4return return

2*82*8return return 2*162*16

(2,0)(2,0) 11

(2,1)(2,1) (2,1)(2,1) (2,1)(2,1) 22

(2,2)(2,2) (2,2)(2,2) (2,2)(2,2) (2,2)(2,2) (2,2)(2,2) 44

(2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) 88

(2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) 1616

(2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) 3232

9 / 38Algoritmi i strukture podataka, FER, 2010./11.

Page 10: ASP 05 Rekurzija[3]

Zadaci za vježbuZadaci za vježbu

Što bi se dogodilo kada bi bila izostavljena linija:Što bi se dogodilo kada bi bila izostavljena linija:if (y <= 0) return 1;if (y <= 0) return 1;

funkcija bi samu sebe pozivala beskonačno puta i nikada ne bi vratila neku vrijednost u funkcija bi samu sebe pozivala beskonačno puta i nikada ne bi vratila neku vrijednost u glavni programglavni program

u gornjem primjeru dogodilo bi se ovo:u gornjem primjeru dogodilo bi se ovo:

pot(2,5);pot(2,5); = 2*pot(2,4)= 2*pot(2,4) = 2*pot(2,3)= 2*pot(2,3) = 2*pot(2,2)= 2*pot(2,2) = 2*pot(2,1)= 2*pot(2,1) = 2*pot(2,0)= 2*pot(2,0) = 2*pot(2,-1)= 2*pot(2,-1) = 2*pot(2,-2)= 2*pot(2,-2) = 2*pot(2,-3)= 2*pot(2,-3) ......

10 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 11: ASP 05 Rekurzija[3]

Zadaci za vježbuZadaci za vježbu

Rješenje bez rekurzije:Rješenje bez rekurzije:

Napisati funkcije koja ispisuju sve brojeve do ili od Napisati funkcije koja ispisuju sve brojeve do ili od nn na razne načine na razne načine RekurzRekurzivniIspisRedomivniIspisRedom

Napisati rekurzivnu funkciju koja računa Napisati rekurzivnu funkciju koja računa n-tin-ti član aritmetičkog nizačlan aritmetičkog niza AritmetickiNizAritmetickiNiz

int pot(long x, long y) {int pot(long x, long y) {

int retval = 1;int retval = 1;

int i;int i;

for (i = 0; i < y; i++) retval *= x;for (i = 0; i < y; i++) retval *= x;

return retval;return retval;

}}

11 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 12: ASP 05 Rekurzija[3]

Leonardo Pisano Fibonacci Leonardo Pisano Fibonacci

rođen: 1170 (vjerojatno) Pisa rođen: 1170 (vjerojatno) Pisa umro: 1250 (vjerojatno) Pisaumro: 1250 (vjerojatno) Pisa

godine 1202godine 1202. Liber abaci. Liber abaci : : uvođenje hindu-arapskih brojevauvođenje hindu-arapskih brojeva simultane linearne jednadžbesimultane linearne jednadžbe trgovački matematički problemitrgovački matematički problemi izračun profitaizračun profita preračunavanje valutapreračunavanje valuta

12 / 38Algoritmi i strukture podataka, FER, 2010./11.

Page 13: ASP 05 Rekurzija[3]

Arapski brojeviArapski brojevi

ne poklapaju se s našim ne poklapaju se s našim “arapskim” brojevima“arapskim” brojevima

najveće dostignuće – uvođenje najveće dostignuće – uvođenje nule i težinskih mjestanule i težinskih mjesta

٠٠ 0 Sifer 0 Sifer ١١ 1 Wahid1 Wahid٢٢ 2 Ithinin 2 Ithinin ٣٣ 3 Thalatha 3 Thalatha ٤٤ 4 Arba'a 4 Arba'a ٥٥ 5 Kamisa 5 Kamisa ٦٦ 6 Sita 6 Sita ٧٧ 7 Saba'a 7 Saba'a ٨٨ 8 Thamania 8 Thamania ٩٩ 9 Tisa'a 9 Tisa'a ٠٠ ١١ 10 Ashara10 Ashara

13 / 38Algoritmi i strukture podataka, FER, 2010./11.

Page 14: ASP 05 Rekurzija[3]

Fibonaccijevi brojeviFibonaccijevi brojevi

1, 1, 2, 3, 5, 8, 13, 21, 34,... (koji je sljedeći?)1, 1, 2, 3, 5, 8, 13, 21, 34,... (koji je sljedeći?)FF00=F=F11=1=1

FFii=F=Fi-2i-2+F+Fi-1i-1; i>1; i>1 program je vrlo kratak i potpuno odgovara matematičkoj definicijiprogram je vrlo kratak i potpuno odgovara matematičkoj definiciji

– učinkovitost je vrlo niskaučinkovitost je vrlo niska

int F(int n) {int F(int n) {

if (n <= 1) if (n <= 1)

return 1;return 1;

elseelse

return F(n-2) + F(n-1);return F(n-2) + F(n-1);

}}

14 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 15: ASP 05 Rekurzija[3]

Fibonaccijevi brojevi – izvođenje programaFibonaccijevi brojevi – izvođenje programaF(0) se izračunava 5 putaF(0) se izračunava 5 putaF(1) se izračunava 8 putaF(1) se izračunava 8 putaF(2) se izračunava 5 putaF(2) se izračunava 5 putaF(3) se izračunava 3 putaF(3) se izračunava 3 putaF(4) se izračunava 2 putaF(4) se izračunava 2 putaF(5) se izračunava 1 putaF(5) se izračunava 1 putaF(6) se izračunava 1 putaF(6) se izračunava 1 puta

Ukupno : 25Ukupno : 25

Fibonacci

F(4)F(4)

F(6)F(6)

F(5)F(5)

F(0)F(0)

F(2)F(2)

22F(1)F(1)11

33 F(3)F(3)

F(1)F(1) F(2)F(2)44

F(0)F(0) F(1)F(1)55 66

77

88

99

F(3)F(3)

F(1)F(1) F(2)F(2)

F(0)F(0) F(1)F(1)1111

1313

1414 F(4)F(4)

F(0)F(0)

F(2)F(2)

1616F(1)F(1)1515

1717 F(3)F(3)

F(1)F(1) F(2)F(2)1818

F(0)F(0) F(1)F(1)1919 2020

2121

2222

2323

1212

1010

2424

2525

11 11

22

11 11

2211

33

55

11 11 11 11

11 11

11 22

33222211

33

88

1313

55

15 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 16: ASP 05 Rekurzija[3]

Najveća zajednička mjeraNajveća zajednička mjera

jedan od najstarijih algoritama je Euklidov postupak za pronalaženjejedan od najstarijih algoritama je Euklidov postupak za pronalaženje najveće zajedničke mjerenajveće zajedničke mjere ((nzmnzm) dva nenegativna cijela broja:) dva nenegativna cijela broja:

Euklid

ako je ako je bb = 0 = 0

nzmnzm = = aa

inačeinače

nzmnzm = najveća zajednička mjera od = najveća zajednička mjera od bb i i

ostatka dijeljenja ostatka dijeljenja a a sa sa bb

16 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 17: ASP 05 Rekurzija[3]

Najveća zajednička mjera – primjer i funkcijaNajveća zajednička mjera – primjer i funkcija

primjer:primjer:nzm(22,8) = nzm(8,6) = nzm(6,2) = nzm(2,0) = 2nzm(22,8) = nzm(8,6) = nzm(6,2) = nzm(2,0) = 2

nzm(21,13) = nzm(13,8) = nzm(8,5) = nzm(5,3) = nzm(21,13) = nzm(13,8) = nzm(8,5) = nzm(5,3) = nzm(3,2) = nzm(2,1) = nzm(1,0) nzm(3,2) = nzm(2,1) = nzm(1,0) = 1= 1

nzm (21,0) = 21nzm (21,0) = 21

nzm (0,21) = nzm (21,0) = 21nzm (0,21) = nzm (21,0) = 21 rekurzivna funkcija:rekurzivna funkcija:

int nzm (int a, int b) {int nzm (int a, int b) {

if(b == 0) return a;if(b == 0) return a;

return nzm (b, a % b);return nzm (b, a % b);

}}

17 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 18: ASP 05 Rekurzija[3]

Traženje člana poljaTraženje člana polja

Rekurzivni postupak za traženje indeksa prvog člana Rekurzivni postupak za traženje indeksa prvog člana jednodimenzionalnog polja od jednodimenzionalnog polja od nn članova koji ima vrijednost članova koji ima vrijednost xx. Ako . Ako takvoga nema, rezultat je takvoga nema, rezultat je -1-1..

pretraživanje počinje pozivom funkcijepretraživanje počinje pozivom funkcije trazi(A, x, n, 0)trazi(A, x, n, 0)..

Rekurzija

int trazi (tip A[], tip x, int n, int i) {int trazi (tip A[], tip x, int n, int i) {

if(i >= n) return -1;if(i >= n) return -1;

if(A[i] == x) return i;if(A[i] == x) return i;

return trazi (A, x, n, i+1);return trazi (A, x, n, i+1);

}}

18 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 19: ASP 05 Rekurzija[3]

Pretraživanje s ograničavačemPretraživanje s ograničavačem

pretraživanje je brže ako se prethodno u polje prošireno za jedan pretraživanje je brže ako se prethodno u polje prošireno za jedan član stavi tzv. ograničivač (član stavi tzv. ograničivač (sentinelsentinel)) A[n] = x;A[n] = x;

poziv: poziv: tip i; tip i;

A[n] = x;A[n] = x;

if ((i = if ((i = trazi1 (A, x, 0)trazi1 (A, x, 0)) == n) ...) == n) ...

int trazi1 (tip A[], tip x, int i){int trazi1 (tip A[], tip x, int i){

if(A[i] == x)if(A[i] == x) return i;return i;

return trazi1 (A, x, i+1)return trazi1 (A, x, i+1)

}}

19 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 20: ASP 05 Rekurzija[3]

Traženje najvećeg člana poljaTraženje najvećeg člana polja

određivanje indeksa najvećeg člana u polju od određivanje indeksa najvećeg člana u polju od nn članova članova

Rekurzija

int maxclan (int A[], int i, int n) {int maxclan (int A[], int i, int n) {

int imax;int imax;

if (i >= n-1) return n-1;if (i >= n-1) return n-1;

imax = maxclan (A, i + 1, n);imax = maxclan (A, i + 1, n);

if (A[i] > A[imax]) return i;if (A[i] > A[imax]) return i;

return imax;return imax;

}}

20 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 21: ASP 05 Rekurzija[3]

Traženje najvećeg člana poljaTraženje najvećeg člana polja

određivanje najvećeg člana u polju od određivanje najvećeg člana u polju od nn članova članova Zašto je ova izvedba neučinkovita?Zašto je ova izvedba neučinkovita?

#define maxof(a,b) ((a) > (b) ? (a) : (b)) #define maxof(a,b) ((a) > (b) ? (a) : (b))

int maxclan2 (int A[], int i, int n) {int maxclan2 (int A[], int i, int n) {

if (i >= n-1) return A[i];if (i >= n-1) return A[i];

else return maxof(A[i], maxclan2 (A, i + 1, n));else return maxof(A[i], maxclan2 (A, i + 1, n));

}}

Rekurzija

21 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 22: ASP 05 Rekurzija[3]

Karakteristike rekurzijeKarakteristike rekurzije

osnovni slučajeviosnovni slučajevi uvijek moraju postojati osnovni slučajevi koji se rješavaju bez rekurzijeuvijek moraju postojati osnovni slučajevi koji se rješavaju bez rekurzije

napredovanjenapredovanje za slučajeve koji se rješavaju rekurzivno, svaki sljedeći rekurzivni poziv za slučajeve koji se rješavaju rekurzivno, svaki sljedeći rekurzivni poziv

mora se približiti osnovnim slučajevimamora se približiti osnovnim slučajevima pravilo projektiranjapravilo projektiranja

podrazumijeva se da svaki rekurzivni poziv funkcionirapodrazumijeva se da svaki rekurzivni poziv funkcionira pravilo neponavljanjapravilo neponavljanja

ne valja dopustiti da se isti problem rješava odvojenim rekurzivnim pozivimane valja dopustiti da se isti problem rješava odvojenim rekurzivnim pozivima to rezultira umnažanjem posla, vidi npr. Fibonaccijeve brojeveto rezultira umnažanjem posla, vidi npr. Fibonaccijeve brojeve

22 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 23: ASP 05 Rekurzija[3]

Primjer pogreškePrimjer pogreške

za vrijednostza vrijednost n = 1n = 1 rekurzivni poziv je opet s argumentom rekurzivni poziv je opet s argumentom 11 nema napredovanja prema osnovnom slučajunema napredovanja prema osnovnom slučaju

program ne radi niti za druge vrijednosti argumenta: program ne radi niti za druge vrijednosti argumenta: npr. zanpr. za n = 4n = 4, , rekurzivno se poziva rekurzivno se poziva loslos s argumentom s argumentom 4/3 +1 = 4/3 +1 = 22, zatim, zatim 2/3 +1 = 12/3 +1 = 1 i dalje stalnoi dalje stalno 1/3 +1 = 11/3 +1 = 1

int los (int n) {int los (int n) {

if (n == 0) return 0;if (n == 0) return 0;

return los (n / 3 + 1) + n - 1;return los (n / 3 + 1) + n - 1;

}}

23 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 24: ASP 05 Rekurzija[3]

RekurzijaRekurzija

Zadaci za vježbuZadaci za vježbu

Page 25: ASP 05 Rekurzija[3]

KamateKamate

Zadana suma novaca oročena je u banci na zadani broj godina uz Zadana suma novaca oročena je u banci na zadani broj godina uz zadanu godišnju kamatnu stopu. Napisati program koji računa zadanu godišnju kamatnu stopu. Napisati program koji računa dobivenu sumu nakon isteka oročenja.dobivenu sumu nakon isteka oročenja.

KamateKamate

25 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 26: ASP 05 Rekurzija[3]

PremetaljkaPremetaljka

premetaljkapremetaljka (anagram)– riječ u kojoj su permutirana sva slova (anagram)– riječ u kojoj su permutirana sva slova anagrami od PAS: PAS, PSA, APS, anagrami od PAS: PAS, PSA, APS, ASPASP, SAP, SPA, SAP, SPA za riječ od za riječ od nn različitih slova ima različitih slova ima n!n! mogućih permutacija mogućih permutacija

kako to postićikako to postići:: uvijek se premeće uvijek se premeće n-1n-1 slova s desne straneslova s desne strane kao prvo slovo treba rotirati svih kao prvo slovo treba rotirati svih nn slova, pri čemu se sva slova pomiču za slova, pri čemu se sva slova pomiču za

jedno mjesto ulijevo, osim prvog, koje odlazi na krajnje desno mjestojedno mjesto ulijevo, osim prvog, koje odlazi na krajnje desno mjesto ovi koraci se ponavljaju ovi koraci se ponavljaju nn puta puta

rotiranjem slova postiže se da svako slovo može biti početnorotiranjem slova postiže se da svako slovo može biti početno dok je izabrano slovo početno, sva ostala slova se premećudok je izabrano slovo početno, sva ostala slova se premeću

osnovni slučaj: treba premetnuti jedno slovoosnovni slučaj: treba premetnuti jedno slovo PremetaljkaPremetaljka

26 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 27: ASP 05 Rekurzija[3]

ObrtaljkaObrtaljka

Napišite program koji će rekurzivno provjeriti je li zadana riječ ili Napišite program koji će rekurzivno provjeriti je li zadana riječ ili rečenica rečenica obrtaljkaobrtaljka (palindrom). U ulaznom nizu podataka zanemarite (palindrom). U ulaznom nizu podataka zanemarite razmak i sve znakove interpunkcije.razmak i sve znakove interpunkcije. primjeri: primjeri:

– UDOVICA BACI VODUUDOVICA BACI VODU– ON VIDI DIVNOON VIDI DIVNO– U RIMU UMIRUU RIMU UMIRU– ANA NABRA PAR BANANAANA NABRA PAR BANANA

uputa: ako u palindromu izbacite prvo i posljednje slovo, preostali tekst uputa: ako u palindromu izbacite prvo i posljednje slovo, preostali tekst također mora biti obrtaljkatakođer mora biti obrtaljka

ObrtaljkaObrtaljka

27 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 28: ASP 05 Rekurzija[3]

Hanojski tornjeviHanojski tornjevi

Postoje štapovi Postoje štapovi II (izvor), (izvor), OO (odredište), (odredište), PP (pomoćni). Na prvom štapu ( (pomoćni). Na prvom štapu (II) ima ) ima nn diskova različite veličine postavljenih tako da veći nikad ne dolazi iznad manjeg. diskova različite veličine postavljenih tako da veći nikad ne dolazi iznad manjeg. Uz minimalni broj operacija preselite sve diskove na Uz minimalni broj operacija preselite sve diskove na OO, jedan po jedan. Disk se , jedan po jedan. Disk se smije postaviti ili na prazan štap ili tako da je manji disk na većem. smije postaviti ili na prazan štap ili tako da je manji disk na većem.

algoritam rješenja:algoritam rješenja: ignorirati donji (najveći) disk i riješiti problem za ignorirati donji (najveći) disk i riješiti problem za n-1n-1 disk, ali sa štapa disk, ali sa štapa II na štap na štap PP koristeći koristeći

OO kao pomoćni kao pomoćni sada se najveći disk nalazi na sada se najveći disk nalazi na II, a ostalih , a ostalih n-1n-1 na na PP preseliti najveći disk sa preseliti najveći disk sa II na na OO preseliti preseliti n-1n-1 disk sa disk sa PP na na OO koristeći koristeći II kao pomoćni (problem je već riješen za kao pomoćni (problem je već riješen za n-1n-1 disk) disk)

HanoiHanoi

28 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 29: ASP 05 Rekurzija[3]

Osam kraljicaOsam kraljica

Napisati funkciju koja će pronaći položaj 8 kraljica na šahovskoj Napisati funkciju koja će pronaći položaj 8 kraljica na šahovskoj ploči, tako da se one međusobno ne napadaju.ploči, tako da se one međusobno ne napadaju.

algoritam rješenja:algoritam rješenja: promatramo stupce na šahovskoj ploči od prvog prema zadnjempromatramo stupce na šahovskoj ploči od prvog prema zadnjem u svaki postavljamo jednu kraljicuu svaki postavljamo jednu kraljicu promatramo ploču u situaciji kada je već postavljeno promatramo ploču u situaciji kada je već postavljeno ii kraljica (u i različitih kraljica (u i različitih

stupaca) koje se međusobno ne napadajustupaca) koje se međusobno ne napadaju želimo postaviti želimo postaviti ii ++ 11 kraljicu tako da ona ne napada niti jednu od već kraljicu tako da ona ne napada niti jednu od već

postavljenih kraljica i da se ostale kraljice mogu postaviti uz uvjet postavljenih kraljica i da se ostale kraljice mogu postaviti uz uvjet nenapadanjanenapadanja

napomena:napomena: postoje 92 različita rješenjapostoje 92 različita rješenja

KraljiceKraljice

29 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 30: ASP 05 Rekurzija[3]

Obilazak šahovske ploče konjem (Knight’s Tour)Obilazak šahovske ploče konjem (Knight’s Tour)

Napišite program koji će ispisati put konja na šahovskoj ploči, tako Napišite program koji će ispisati put konja na šahovskoj ploči, tako da na svako polje stane samo jednom. Put konja započnite u da na svako polje stane samo jednom. Put konja započnite u gornjem lijevom polju (A8).gornjem lijevom polju (A8). konj se kreće u obliku slova L, na slici su crvenom bojom označena polja na konj se kreće u obliku slova L, na slici su crvenom bojom označena polja na

koja se konj smije pomaknuti s trenutnog položajakoja se konj smije pomaknuti s trenutnog položaja ima nekoliko milijardi rješenjaima nekoliko milijardi rješenja 122 milijuna su zatvorena putanja122 milijuna su zatvorena putanja

KonjKonj

30 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 31: ASP 05 Rekurzija[3]

RekurzijaRekurzija

Složenost pri rekurzijiSloženost pri rekurziji

Page 32: ASP 05 Rekurzija[3]

Primjer za različite složenosti istog problema (M.A. Weiss) – 1 Primjer za različite složenosti istog problema (M.A. Weiss) – 1

Zadano je polje cijelih brojeva AZadano je polje cijelih brojeva A00, A, A22,…,A,…,An-1n-1. Brojevi mogu biti i . Brojevi mogu biti i negativni. Treba pronaći najveću vrijednost sume niza brojeva. negativni. Treba pronaći najveću vrijednost sume niza brojeva. Pretpostavit će se da je najveća suma 0 ako su svi brojevi negativni.Pretpostavit će se da je najveća suma 0 ako su svi brojevi negativni.

MaxPodSumaNiza3MaxPodSumaNiza3 O(nO(n33)) Ispituju se svi mogući podnizovi. U vanjskoj petlji varira se prvi član podniza Ispituju se svi mogući podnizovi. U vanjskoj petlji varira se prvi član podniza

od nultog do zadnjeg. U srednjoj petlji varira se zadnji član podniza od prvog od nultog do zadnjeg. U srednjoj petlji varira se zadnji član podniza od prvog člana do zadnjega člana polja. U unutrašnjoj petlji varira se duljina niza od člana do zadnjega člana polja. U unutrašnjoj petlji varira se duljina niza od prvog člana do zadnjeg člana. prvog člana do zadnjeg člana.

Sve 3 petlje se za najgori slučaj obavljaju Sve 3 petlje se za najgori slučaj obavljaju nn puta. Zbog toga je apriorna puta. Zbog toga je apriorna složenost složenost O(nO(n33) ) ..

RazneSlozenostiRazneSlozenosti

32 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 33: ASP 05 Rekurzija[3]

Primjer za različite složenosti istog problema – 2 Primjer za različite složenosti istog problema – 2

MaxPodSumaNiza2MaxPodSumaNiza2 O(nO(n22)) ako uočimo da vrijedi: ako uočimo da vrijedi:

složenost se može reducirati uklanjanjem jedne petljesloženost se može reducirati uklanjanjem jedne petlje

1j j

k j kk i k i

A A A

RazneSlozenostiRazneSlozenosti

33 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 34: ASP 05 Rekurzija[3]

Primjer za različite složenosti istog problema – 3Primjer za različite složenosti istog problema – 3

MaxPodSumaMaxPodSuma O(nlogO(nlog22n)n) relativno složeni rekurzivni postupakrelativno složeni rekurzivni postupak kad ne bi bilo i boljeg (linearnog) rješenja, ovo bi bio dobar primjer snage kad ne bi bilo i boljeg (linearnog) rješenja, ovo bi bio dobar primjer snage

rekurzije i postupka podijeli-pa-vladaj (divide-and-conquer).rekurzije i postupka podijeli-pa-vladaj (divide-and-conquer). Ako se ulazno polje podijeli približno po sredini, rješenje može biti takvo da Ako se ulazno polje podijeli približno po sredini, rješenje može biti takvo da

je maksimalna suma u lijevom dijelu polja, ili je u desnom dijelu polja ili je maksimalna suma u lijevom dijelu polja, ili je u desnom dijelu polja ili prolazi kroz oba dijela. Prva dva slučaja mogu biti riješena rekurzivno. prolazi kroz oba dijela. Prva dva slučaja mogu biti riješena rekurzivno. Zadnji slučaj se može realizirati tako da se nađe najveća suma u lijevom Zadnji slučaj se može realizirati tako da se nađe najveća suma u lijevom dijelu koja uključuje njegov zadnji član i najveća suma u desnom dijelu koja dijelu koja uključuje njegov zadnji član i najveća suma u desnom dijelu koja uključuje njegov prvi član. Te se dvije sume zbroje i uspoređuju s one prve uključuje njegov prvi član. Te se dvije sume zbroje i uspoređuju s one prve dvije. dvije.

34 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 35: ASP 05 Rekurzija[3]

Primjer za različite složenosti istog problema – 4Primjer za različite složenosti istog problema – 4

Najveća lijeva suma je od članova 0 do 2 i iznosi 6. Najveća desna Najveća lijeva suma je od članova 0 do 2 i iznosi 6. Najveća desna suma je od članova 5 do 6 i iznosi 8. Najveća lijeva suma koja suma je od članova 5 do 6 i iznosi 8. Najveća lijeva suma koja uključuje zadnji član na lijevo je od 0 do 3 člana i iznosi 4, a desno uključuje zadnji član na lijevo je od 0 do 3 člana i iznosi 4, a desno od 4 do 6 člana i iznosi 7. Ukupno to daje sumu 11 koja je onda i od 4 do 6 člana i iznosi 7. Ukupno to daje sumu 11 koja je onda i najveća.najveća. pozivni program za početne rubove zadaje pozivni program za početne rubove zadaje 00 i i n-1n-1

44 -3-3 55 -2-2 -1-1 22 66 -2-2

00 11 22 33 44 55 66 77

Desni dioDesni dioLijevi dioLijevi dio

35 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 36: ASP 05 Rekurzija[3]

Primjer za različite složenosti istog problema – 5Primjer za različite složenosti istog problema – 5

Programski kôd je relativno složen, ali daje za red veličine bolje Programski kôd je relativno složen, ali daje za red veličine bolje rezultate od prethodnoga. Znači da rezultate od prethodnoga. Znači da kraći kôd ne implicira i bolji kôd!kraći kôd ne implicira i bolji kôd!

Ako bi Ako bi nn bio potencija od bio potencija od 2 2 intuitivno se vidi da će sukcesivnih intuitivno se vidi da će sukcesivnih raspolavljanja biti raspolavljanja biti loglog22 n n. To će se detaljnije dokazivati kasnije kod . To će se detaljnije dokazivati kasnije kod

binarnih stabala. Budući da kroz postupak prolazi binarnih stabala. Budući da kroz postupak prolazi nn podataka, podataka, imamo imamo O(n logO(n log22n) n) ..

Općenito se može reći da je trajanje algoritma Općenito se može reći da je trajanje algoritma O(logO(log22n)n) ako u ako u

vremenu vremenu O(O(11)) podijeli veličinu problema (obično ga raspolovi). podijeli veličinu problema (obično ga raspolovi). Ako u pojedinom koraku reducira problem za Ako u pojedinom koraku reducira problem za 11, onda je njegovo , onda je njegovo

trajanje trajanje O(n) O(n) ..

36 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 37: ASP 05 Rekurzija[3]

Primjer za različite složenosti istog problema – 6Primjer za različite složenosti istog problema – 6

MaxPodSumaNiza1MaxPodSumaNiza1 O(n)O(n) zbrajaju se svi članovi polja redom, a pamti se ona suma koja je u cijelom zbrajaju se svi članovi polja redom, a pamti se ona suma koja je u cijelom

tijeku tog postupka bila najvećatijeku tog postupka bila najveća

37 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 38: ASP 05 Rekurzija[3]

Analiza a posterioriAnaliza a posteriori

Primjer: izračunati Primjer: izračunati modmod sortiranog cjelobrojnog polja, tj. odrediti član sortiranog cjelobrojnog polja, tj. odrediti član polja koji se najčešće pojavljuje i prebrojati njegovu učestalost.polja koji se najčešće pojavljuje i prebrojati njegovu učestalost. ModPoljaModPolja mode0mode0 izravno rješavanjeizravno rješavanje rmode0rmode0 rekurzivni postupak rekurzivni postupak rmode1rmode1 rekurzivni postupak transformiran u iterativni rekurzivni postupak transformiran u iterativni

Sva tri postupka imajuSva tri postupka imaju vrijeme izvođenjavrijeme izvođenja (n) (n). Koji je najbolji?. Koji je najbolji?

38 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 39: ASP 05 Rekurzija[3]

rmode0rmode0

Zamislimo da je u polju od Zamislimo da je u polju od nn članova članova a[0:n-1]a[0:n-1] izračunat mod i izračunat mod i učestalost učestalost ff za prvih za prvih n-1n-1 članova polja. Pod kojim uvjetima zadnji članova polja. Pod kojim uvjetima zadnji član polja može promijeniti mod? Ako je član polja može promijeniti mod? Ako je a[n-1] != a[n-2]a[n-1] != a[n-2] niti mod niti učestalost se ne mijenjaju. Ako jest jednak, kako niti mod niti učestalost se ne mijenjaju. Ako jest jednak, kako razlikovati između 3 moguća slučaja:razlikovati između 3 moguća slučaja: a) nađen je novi moda) nađen je novi mod b) mod je isti, ali se povećava učestalost b) mod je isti, ali se povećava učestalost ff c) nema promjene ni moda niti učestalosti c) nema promjene ni moda niti učestalosti

odgovor ovisi o tome je li odgovor ovisi o tome je li a[n-1] == a[n-1 - f]a[n-1] == a[n-1 - f] ako jest, onda ima ako jest, onda ima n-1 - (n-1 - f) +1 = f + 1n-1 - (n-1 - f) +1 = f + 1

pojavljivanja vrijednosti koje je u pojavljivanja vrijednosti koje je u a[n-1]a[n-1]. To znači da je ta vrijednost . To znači da je ta vrijednost sigurno ili novi mod ili stari mod s uvećanom učestalošću sigurno ili novi mod ili stari mod s uvećanom učestalošću ff..

39 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 40: ASP 05 Rekurzija[3]

Zadaci za vježbuZadaci za vježbu

primjeri rekurzivnih poziva funkcijeprimjeri rekurzivnih poziva funkcije PrimjeriRekurzijePrimjeriRekurzije

40 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 41: ASP 05 Rekurzija[3]

Zadaci za vježbuZadaci za vježbu

Napisati program za računanje binomnog koeficijenta koristeći izraz:Napisati program za računanje binomnog koeficijenta koristeći izraz:a) a) BINOM(BINOM(nn, , mm) = ) = nn!/(!/(mm!(!(nn--mm)!))!)

b) b) BINOM(BINOM(nn, , mm) = BINOM() = BINOM(nn-1, -1, mm) + BINOM() + BINOM(nn-1, -1, mm-1);-1); BINOM(BINOM(nn, 0) = BINOM(, 0) = BINOM(nn, , nn) = 1) = 1

BinomniKoeficijentiBinomniKoeficijenti

Napisati funkciju koja će na zaslon ispisati prvih Napisati funkciju koja će na zaslon ispisati prvih nn redaka redaka Pascalovog trokuta. Kolika je apriorna složenost?Pascalovog trokuta. Kolika je apriorna složenost? BinomniKoeficijentiBinomniKoeficijenti

PascalovTrokutRekurzijaPascalovTrokutRekurzija

41 / 42Algoritmi i strukture podataka, FER, 2010./11.

Page 42: ASP 05 Rekurzija[3]

Problem trgovačkog putnikaProblem trgovačkog putnika

Problem trgovačkog putnika (TSP; Problem trgovačkog putnika (TSP; Travelling Salesman ProblemTravelling Salesman Problem): zadan je ): zadan je skup od skup od nn gradova gradova GG i cijene i cijene ccijij putovanja iz grada putovanja iz grada i u grad u grad j.. Potrebno je, Potrebno je, krenuvši iz zadanog grada, obići sve gradove točno jednom, tako da ukupni krenuvši iz zadanog grada, obići sve gradove točno jednom, tako da ukupni trošak puta bude najmanji. trošak puta bude najmanji. cij = cji

TSP(Gi, G) = min (cij + TSP (Gj, G \ Gj))

jj

TSP(Gi, {Gj}) = cij

Složenost: O(n!), ~(n!/2)

TSPTSP

42 / 42Algoritmi i strukture podataka, FER, 2010./11.