40
Algoritmi i strukture podataka Algoritmi i strukture podataka Rekurzija Rekurzija

Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

  • Upload
    vocong

  • View
    261

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podatakaAlgoritmi i strukture podataka

RekurzijaRekurzija

Page 2: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 2 / 40

Osnovna Osnovna ideja rekurzijeideja rekurzije

proceduraprocedura poziva samu sebepoziva samu sebemoramora postojati postojati zavrzavrššetak!etak!

zazašštoto se dug napravljen kreditnom karticom ne mose dug napravljen kreditnom karticom ne možže platiti istom e platiti istom kreditnom karticom?kreditnom karticom?rekurzivnirekurzivni programi su kraprogrami su kraćći, ali i, ali je izvođenjeje izvođenje programa programa duljedulje

neki jezici (npr. stare verzije jezika FORTRAN) ne podrneki jezici (npr. stare verzije jezika FORTRAN) ne podržžavaju rekurzijuavaju rekurziju

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

rekurzija:rekurzija:

vidi: rekurzijavidi: rekurzija

rekurzija:rekurzija:

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

Page 3: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 3 / 40

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 ff’’ ff’’’’ ff’’’’’’

Page 4: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 4 / 40

IzraIzraččunavanje unavanje faktorijelafaktorijela

jedanjedan od jednostavnih rekurzivnih algoritama jest izraod jednostavnih rekurzivnih algoritama jest izraččunavanje unavanje n!n!za za n >= n >= 00

0! = 10! = 1

1! = 11! = 1

n! = n* (n! = n* (nn--1)!1)!

primjerprimjer: 4!: 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(nreturn n * fakt(n--1);1);

}}

}}

Page 5: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 5 / 40

IzraIzraččuvananje faktorijelauvananje 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(nn * fakt(n--1);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(nn * fakt(n--1);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(nn * fakt(n--1);1);

}}

}}

faktfakt faktfakt’’’’faktfakt’’

33

22

33

22

11

1122

66

Page 6: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 6 / 40

Zadaci za vjeZadaci za vježžbubu

Napisati funkciju koja prima Napisati funkciju koja prima dva cjelobrojnadva cjelobrojna argumenta argumenta xx i i yy ii vravraćća a preko imena vrijednost preko imena vrijednost xxyy..

PotencijaRekurzijomPotencijaRekurzijom

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

= 2*= 2*potpot(2,4)(2,4)

= 2*= 2*potpot(2,3)(2,3)

= 2*= 2*potpot(2,2)(2,2)

= 2*= 2*potpot(2,1)(2,1)

= 2*= 2*potpot(2,0)(2,0)

= = 11

Page 7: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 7 / 40

SadrSadržžaj stogaaj stoga

returnreturn2*162*16

returnreturn2*82*8

returnreturn2*42*4

returnreturn2*22*2

returnreturn2*12*1

returnreturn11

potpot(2,0)(2,0)potpot(2,1)(2,1)potpot(2,2)(2,2)potpot(2,3)(2,3)potpot(2,4)(2,4)potpot(2,5)(2,5)

3232(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)1616(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)

88(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)44(2,2)(2,2)(2,2)(2,2)(2,2)(2,2)(2,2)(2,2)(2,2)(2,2)

22(2,1)(2,1)(2,1)(2,1)(2,1)(2,1)11(2,0)(2,0)

Page 8: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 8 / 40

Zadaci za vjeZadaci za vježžbubu

šštoto bi se dogodilo kada bi bila izostavljena linija:bi se dogodilo kada bi bila izostavljena linija:ifif (y <= 0) (y <= 0) returnreturn 1;1;

funkcijafunkcija bi samu sebe pozivala beskonabi samu sebe pozivala beskonaččno puta i nikada ne bi vratila neku no puta i nikada ne bi vratila neku vrijednost u glavni vrijednost u glavni programprogram

uu gornjem primjeru dogodilo bi se gornjem primjeru dogodilo bi se ovo:ovo:

potpot(2,5);(2,5);= 2*= 2*potpot(2,4)(2,4)

= 2*= 2*potpot(2,3)(2,3)= 2*= 2*potpot(2,2)(2,2)

= 2*= 2*potpot(2,1)(2,1)= 2*= 2*potpot(2,0)(2,0)

= 2*= 2*potpot(2,(2,--1)1)= 2*= 2*potpot(2,(2,--2)2)

= 2*= 2*potpot(2,(2,--3)3)

......

Page 9: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 9 / 40

Zadaci za vjeZadaci za vježžbubu

rjerješšenjeenje bez bez rekurzije:rekurzije:

napisatinapisati funkcije koja ispisuju sve brojeve do ili od funkcije koja ispisuju sve brojeve do ili od nn na razne na razne nanaččineineRekurzRekurzivniIspisRedomivniIspisRedom

napisatinapisati rekurzivnu funkciju koja rarekurzivnu funkciju koja raččuna una nn--titi ččlan aritmetilan aritmetiččkog kog nizanizaAritmetickiNizAritmetickiNiz

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;

}}

Page 10: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 10 / 40

LeonardoLeonardo Pisano Pisano FibonacciFibonacci

RođenRođen: 1170 (vjerojatno) : 1170 (vjerojatno) PisaPisaUmro: 1250 (vjerojatno) Umro: 1250 (vjerojatno) PisaPisa

Godine Godine 12021202. Liber. Liber abaciabaci : : uvođenjeuvođenje hinduhindu--arapskih brojevaarapskih brojevasimultanesimultane linearne jednadlinearne jednadžžbebetrgovatrgovaččkiki matematimatematiččki problemiki problemiizraizraččunun profitaprofitaprerapreraččunavanjeunavanje valutavaluta

Page 11: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 11 / 40

Arapski brojeviArapski brojevi

ne poklapaju se s nane poklapaju se s naššim im ““arapskimarapskim”” brojevimabrojevimanajvenajvećće dostignue dostignućće e –– uvođenje uvođenje nule i tenule i težžinskih mjestainskih mjesta

٠٠ 0 0 SiferSifer١١ 1 1 WahidWahid٢٢ 2 2 IthininIthinin٣٣ 3 3 ThalathaThalatha٤٤ 4 4 Arba'aArba'a٥٥ 5 5 KamisaKamisa٦٦ 6 6 SitaSita٧٧ 7 7 Saba'aSaba'a٨٨ 8 8 ThamaniaThamania٩٩ 9 9 Tisa'aTisa'a١١ 10 10 AsharaAshara

Page 12: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 12 / 40

FibonaccijeviFibonaccijevi brojevibrojevi

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

FFii=F=Fii--22+F+Fii--11; i>1; i>1

programprogram je vrlo kratak i potpuno odgovara matematije vrlo kratak i potpuno odgovara matematiččkoj koj definicijidefiniciji-- uuččinkovitost je vrloinkovitost je vrlo niskaniska

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

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

return 1;return 1;

elseelse

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

}}

Page 13: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 13 / 40

FibonaccijeviFibonaccijevi brojevi brojevi –– izvođenje programa izvođenje programaF(0F(0) se izra) se izraččunava 5 putaunava 5 putaF(1) se izraF(1) se izraččunava 8 putaunava 8 putaF(2) se izraF(2) se izraččunava 5 putaunava 5 putaF(3) se izraF(3) se izraččunava 3 putaunava 3 putaF(4) se izraF(4) se izraččunava 2 putaunava 2 putaF(5) se izraF(5) se izraččunava 1 putaunava 1 putaF(6) se izraF(6) se izraččunava 1 putaunava 1 puta

Ukupno Ukupno :: 2525

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

Page 14: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 14 / 40

NajveNajvećća zajednia zajedniččka mjeraka mjera

jedan od najstarijih algoritama je Euklidov postupak za pronalajedan od najstarijih algoritama je Euklidov postupak za pronalažženjeenjenajvenajvećće zajednie zajedniččke mjereke mjere ((nzmnzm) dva nenegativna cijela broja:) dva nenegativna cijela broja:

Euklid

ako je ako je bb = 0= 0

nzmnzm = = aa

inainaččeenzmnzm = najve= najvećća zajednia zajedniččka mjera od ka mjera od bb i i

a dijeljenja a dijeljenja a a sa sa bb

Page 15: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 15 / 40

NajveNajvećća zajednia zajedniččka mjera ka mjera –– primjer i funkcijaprimjer 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) = 1nzm(3,2) = nzm(2,1) = nzm(1,0) = 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);

}}

Page 16: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 16 / 40

TraTražženje enje ččlana poljalana polja

Rekurzivni postupak za traRekurzivni postupak za tražženje indeksa prvog enje indeksa prvog ččlana 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 --11..

pretrapretražživanje poivanje poččinje pozivom funkcijeinje 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 if(i >= n) return --1;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);

}}

Page 17: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 17 / 40

PretraPretražživanje s ograniivanje s ograniččavaavaččemem

PretraPretražživanje je brivanje je bržže ako se prethodno u polje proe ako se prethodno u polje proššireno za jedan ireno za jedan ččlan stavi tzv. ogranilan stavi tzv. ograniččivaivačč ((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)

}}

Page 18: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 18 / 40

TraTražženje najveenje najveććeg eg ččlana poljalana polja

Određivanje indeksa najveOdređivanje indeksa najveććeg eg ččlana u polju od lana u polju od nn ččlanovalanova

Rekurzija

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

int imax;int imax;

if (i >= nif (i >= n--1) return n1) return n--1;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;

}}

Page 19: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 19 / 40

TraTražženje najveenje najveććeg eg ččlana poljalana polja

Određivanje najveOdređivanje najveććeg eg ččlana u polju od lana u polju od nn ččlanovalanova

#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 >= nif (i >= n--1) return A[i];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

Page 20: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 20 / 40

Karakteristike Karakteristike rekurzijerekurzije

osnovniosnovni slusluččajeviajevi: uvijek moraju postojati osnovni slu: uvijek moraju postojati osnovni sluččajevi koji se ajevi koji se rjerješšavaju bez avaju bez rekurzijerekurzijenapredovanjenapredovanje: : zaza slusluččajeve koji se rjeajeve koji se rješšavaju rekurzivno, svaki avaju rekurzivno, svaki sljedesljedećći rekurzivni poziv mora se priblii rekurzivni poziv mora se približžiti osnovnim iti osnovnim slusluččajevimaajevimapravilopravilo projektiranjaprojektiranja: : podrazumijevapodrazumijeva se da svaki rekurzivni poziv se da svaki rekurzivni poziv funkcionirafunkcionirapravilopravilo neponavljanjaneponavljanja: : nene valja dopustiti da se isti problem rjevalja dopustiti da se isti problem rješšava ava odvojenim rekurzivnim odvojenim rekurzivnim pozivimapozivima

toto rezultira umnarezultira umnažžanjem posla, vidi anjem posla, vidi nprnpr. . Fibonaccijeve brojeveFibonaccijeve brojeve

Page 21: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 21 / 40

Primjer pogrePrimjer pogrešškeke

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

program ne radi niti za druge vrijednosti argumenta: npr. zaprogram ne radi niti za druge vrijednosti argumenta: npr. za n = n = 44, , rekurzivno se poziva rekurzivno se poziva loslos s argumentoms argumentom 4/3 +1 = 24/3 +1 = 2, , zatimzatim 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 return los (n / 3 + 1) + n -- 1;1;

}}

Page 22: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

RekurzijaRekurzija

Zadaci za vjeZadaci za vježžbubu

Page 23: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 23 / 40

KamateKamate

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

Page 24: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 24 / 40

Premetaljka (anagram)Premetaljka (anagram)

premetaljka premetaljka –– rijeriječč u kojoj su permutirana sva slovau kojoj su permutirana sva slovaanagrami od PAS: PAS, PSA, APS, anagrami od PAS: PAS, PSA, APS, ASPASP, SAP, SPA, SAP, SPAza rijeza riječč od od nn slova ima slova ima n!n! mogumoguććih permutacijaih permutacija

kako to postikako to postiććii::uvijek se premeuvijek se premećće e nn--11 slova s desne straneslova s desne stranekao prvo slovo treba rotirati svih n slova, pri kao prvo slovo treba rotirati svih n slova, pri ččemu se sva slova pomiemu se sva slova pomičču za u za jedno mjesto ulijevo, osim prvog, koje odlazi na krajnje desno mjedno mjesto ulijevo, osim prvog, koje odlazi na krajnje desno mjestojestoovi koraci se ponavljaju ovi koraci se ponavljaju nn putaputa

rotiranjem slova postirotiranjem slova postižže se da svako slovo moe se da svako slovo možže biti poe biti poččetnoetnodok je izabrano slovo podok je izabrano slovo poččetno, sva ostala slova se premeetno, sva ostala slova se premeććuu

osnovni sluosnovni sluččaj: treba premetnuti jedno slovoaj: treba premetnuti jedno slovo PremetaljkaPremetaljka

Page 25: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 25 / 40

Obrtaljka (palindrom)Obrtaljka (palindrom)

NapiNapiššite program koji ite program koji ćće rekurzivno provjeriti je li zadana rijee rekurzivno provjeriti je li zadana riječč ili ili rereččenica enica obrtaljkaobrtaljka. U ulaznom nizu podataka zanemarite razmak i . U ulaznom nizu podataka zanemarite razmak i sve znakove interpunkcije.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, preostuputa: ako u palindromu izbacite prvo i posljednje slovo, preostali tekst ali tekst također mora biti obrtaljkatakođer mora biti obrtaljka

ObrtaljkaObrtaljka

Page 26: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 26 / 40

Hanojski tornjeviHanojski tornjevi

Postoje Postoje šštapovi tapovi SS (source, izvor), (source, izvor), DD (destination, odredi(destination, odrediššte), te), TT(temp, pomo(temp, pomoććni). Na prvom ni). Na prvom šštapu (tapu (SS) ima ) ima nn diskova razlidiskova različčite veliite veliččine ine postavljenih tako da vepostavljenih tako da većći nikad ne dolazi iznad manjeg. Uz i nikad ne dolazi iznad manjeg. Uz minimalni broj operacija preselite sve diskove na minimalni broj operacija preselite sve diskove na DD, jedan po jedan. , jedan po jedan. Disk se smije postaviti ili na prazan Disk se smije postaviti ili na prazan šštap ili tako da je manji disk na tap ili tako da je manji disk na veveććem. em. Algoritam rjeAlgoritam rješšenja:enja:

ignorirati donji (najveignorirati donji (najvećći) disk i rijei) disk i riješšiti problem za iti problem za nn--11 disk, ali sa disk, ali sa šštapa tapa SS na na šštap tap TT koristekoristećći i DD kao pomokao pomoććninisada se najvesada se najvećći disk nalazi na i disk nalazi na SS, a ostalih , a ostalih nn--11 na na TTpreseliti najvepreseliti najvećći disk sa i disk sa SS na na DDpreseliti preseliti nn--11 disk sa disk sa TT na na DD koristekoristećći i SS kao pomokao pomoććni (problem je veni (problem je veććrijeriješšen za en za nn--11 disk)disk)

HanoiHanoi

Page 27: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 27 / 40

Osam kraljicaOsam kraljica

Napisati funkciju koja Napisati funkciju koja ćće pronae pronaćći poloi položžaj 8 kraljica na aj 8 kraljica na ššahovskoj ahovskoj plopločči, i, tako da se one međusobno ne napadajutako da se one međusobno ne napadaju..AlgoritamAlgoritam rjerješšenja:enja:

promatramo stupce na promatramo stupce na ššahovskoj ploahovskoj pločči od prvog prema zadnjemi od prvog prema zadnjemu svaki postavljamo jednu kraljicuu svaki postavljamo jednu kraljicupromatramo plopromatramo pločču u situaciji kada je veu u situaciji kada je većć postavljeno postavljeno ii kraljicakraljica (u i razli(u i različčitih itih stupaca) koje sstupaca) koje se međusobno ne napadajue međusobno ne napadajužželimo postaviti elimo postaviti ii ++ 11 kraljicu tako da ona ne napada niti jednu od vekraljicu tako da ona ne napada niti jednu od veććpostavljenih kraljica i da se ostale kraljice mogu postaviti uz postavljenih kraljica i da se ostale kraljice mogu postaviti uz uvjet uvjet nenapadanjanenapadanja

Napomene:Napomene:postoje 92 razlipostoje 92 različčita rjeita rješšenjaenja

KraljiceKraljice

Page 28: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 28 / 40

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

NapiNapiššite program koji ite program koji ćće ispisati put konja na e ispisati put konja na ššahovskoj ploahovskoj pločči, tako i, tako da na svako polje stane samo jednom. Put konja zapoda na svako polje stane samo jednom. Put konja započčnite u nite u gornjem lijevom polju (A8).gornjem lijevom polju (A8).

konj se krekonj se krećće u obliku slova L, na slici su crvenom bojom oznae u obliku slova L, na slici su crvenom bojom označčena polja na ena polja na koja se konj smije pomaknuti s trenutnog polokoja se konj smije pomaknuti s trenutnog položžajaajaima nekoliko milijardi rjeima nekoliko milijardi rješšenjaenja122 milijuna su zatvorena putanja122 milijuna su zatvorena putanja

KonjKonj

Page 29: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

RekurzijaRekurzija

SloSložženost pri rekurzijienost pri rekurziji

Page 30: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 30 / 40

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

Zadano je polje cijelih brojeva AZadano je polje cijelih brojeva A00, A, A22,,……,,AAnn--11. Brojevi mogu biti i . Brojevi mogu biti i negativni. Potrebno je pronanegativni. Potrebno je pronaćći najvei najvećću vrijednost sume niza brojeva. u vrijednost sume niza brojeva. Pretpostavit Pretpostavit ćće se da je najvee se da je najvećća suma 0 ako su svi brojevi a suma 0 ako su svi brojevi negativni.negativni.MaxPodSumaNiza3MaxPodSumaNiza3 O(nO(n33))

Ispituju se svi moguIspituju se svi mogućći i podnizovipodnizovi. U vanjskoj varira se prvi . U vanjskoj varira se prvi ččlan lan podnizapodniza od od nultog do zadnjeg. U srednjoj petlji varira se zadnji nultog do zadnjeg. U srednjoj petlji varira se zadnji ččlan lan podnizapodniza od prvog od prvog ččlana do zadnjega lana do zadnjega ččlana polja. U unutralana polja. U unutraššnjoj petlji varira se duljina niza od njoj petlji varira se duljina niza od prvog prvog ččlana do zadnjeg lana do zadnjeg ččlana. lana. SveSve 3 petlje se za najgori slu3 petlje se za najgori sluččaj obavljaju aj obavljaju nn puta. Zbog toga je apriorna puta. Zbog toga je apriorna slosložženost enost O(nO(n33) ) ..

RazneSlozenostiRazneSlozenosti

Page 31: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 31 / 40

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

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

slosložženost se moenost se možže reducirati uklanjanjem jedne petljee reducirati uklanjanjem jedne petlje

1j j

k j kk i k i

A A A−

= =

= +∑ ∑

RazneSlozenostiRazneSlozenosti

Page 32: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 32 / 40

Primjer za razliPrimjer za različčite sloite složženosti istog problema enosti istog problema –– 33

MaxPodSumaMaxPodSuma O(nlogO(nlog22nn))relativnorelativno slosložženi rekurzivni eni rekurzivni postupakpostupakkadkad ne bi bilo i boljeg (linearnog) rjene bi bilo i boljeg (linearnog) rješšenja, ovo bi bio dobar primjer snage enja, ovo bi bio dobar primjer snage rekurzijerekurzije i postupka podijelii postupka podijeli--papa--vladaj (vladaj (dividedivide--andand--conquer).conquer).AkoAko se ulazno polje podijeli priblise ulazno polje podijeli približžno po sredini, rjeno po sredini, rješšenje moenje možže biti takvo da e biti takvo da je maksimalna suma u lijevom dijelu polja, ili je u desnom dijelje maksimalna suma u lijevom dijelu polja, ili je u desnom dijelu polja ili u polja ili prolazi kroz oba dijela. Prva dva sluprolazi kroz oba dijela. Prva dva sluččaja mogu biti rijeaja mogu biti riješšena rekurzivno. ena rekurzivno. Zadnji sluZadnji sluččaj se moaj se možže realizirati tako da se nađe najvee realizirati tako da se nađe najvećća suma u lijevom a suma u lijevom dijelu koja ukljudijelu koja uključčuje njegov zadnji uje njegov zadnji ččlan i najvelan i najvećća suma u desnom dijelu koja a suma u desnom dijelu koja ukljuuključčuje njegov prvi uje njegov prvi ččlan. Telan. Te se dvije sume zbroje i uspoređuju s one prve se dvije sume zbroje i uspoređuju s one prve dvije. dvije.

Page 33: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 33 / 40

Primjer za razliPrimjer za različčite sloite složženosti istog problema enosti istog problema –– 44

NajveNajvećća lijeva suma je od a lijeva suma je od ččlanova 0 do 2 i iznosi 6. Najvelanova 0 do 2 i iznosi 6. Najvećća desna a desna suma je od suma je od ččlanova 5 do 6 i iznosi 8. Najvelanova 5 do 6 i iznosi 8. Najvećća lijeva suma koja a lijeva suma koja ukljuuključčuje zadnji uje zadnji ččlan na lijevo je od 0 do 3 lan na lijevo je od 0 do 3 ččlana i iznosi 4, a desno lana i iznosi 4, a desno od 4 do 6 od 4 do 6 ččlana i iznosi 7. Ukupno to daje sumu 11 koja je onda i lana i iznosi 7. Ukupno to daje sumu 11 koja je onda i najvenajvećća.a.

Pozivni program za poPozivni program za poččetne rubove zadaje 0 i netne rubove zadaje 0 i n--1.1.

44 --33 55 --22 --11 22 66 --22

00 11 22 33 44 55 66 77

Desni dioDesni dioLijevi dioLijevi dio

Page 34: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 34 / 40

Primjer za razliPrimjer za različčite sloite složženosti istog problema enosti istog problema –– 55

Programski kôd je relativno sloProgramski kôd je relativno složžen, ali daje za red velien, ali daje za red veliččine bolje ine bolje rezultate od prethodnoga. Znarezultate od prethodnoga. Značči da i da krakraćći kôd ne implicira i bolji kôd!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 intuitivno se vidi da ćće sukcesivnih e sukcesivnih raspolavljanja biti raspolavljanja biti loglog22 nn. To . To ćće se detaljnije dokazivati kasnije kod e se detaljnije dokazivati kasnije kod binarnih stabala. Budubinarnih stabala. Budućći da kroz postupak prolazi i da kroz postupak prolazi nn podataka, podataka, imamo imamo O(n logO(n log22n) n) ..OpOpććenito se moenito se možže ree rećći da je trajanje algoritma i da je trajanje algoritma O(logO(log22n)n) ako u ako u vremenu vremenu O(O(11)) podijeli velipodijeli veliččinu problema (obiinu problema (običčno ga raspolovi).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) ..

Page 35: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 35 / 40

Primjer za razliPrimjer za različčite sloite složženosti istog problema enosti istog problema –– 66

MaxPodSumaNiza1MaxPodSumaNiza1 O(n)O(n)zbrajaju svi zbrajaju svi ččlanovi polja redom, a pamti se ona suma koja je u cijelom lanovi polja redom, a pamti se ona suma koja je u cijelom tijeku tog postupka bila najvetijeku tog postupka bila najveććaa

Page 36: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 36 / 40

Analiza a Analiza a posterioriposteriori

Primjer: izraPrimjer: izraččunati mod sortiranog cjelobrojnog polja, tj. odrediti unati mod sortiranog cjelobrojnog polja, tj. odrediti ččlan lan polja koji se najpolja koji se najččeeššćće pojavljuje i prebrojati njegovu ue pojavljuje i prebrojati njegovu uččestalost.estalost.

ModPoljaModPolja

mode0mode0 izravno rjeizravno rješšavanjeavanjermode0rmode0 rekurzivni postupakrekurzivni postupakrmode1rmode1 rekurzivni postupak transformiran u iterativnirekurzivni postupak transformiran u iterativni

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

Page 37: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 37 / 40

rmode0rmode0

Zamislimo da je u polju od Zamislimo da je u polju od nn ččlanova lanova a[0:na[0:n--1]1] izraizraččunat mod i unat mod i uuččestalost estalost ff za prvih za prvih nn--11 ččlanova polja. Pod kojim uvjetima zadnji lanova polja. Pod kojim uvjetima zadnji ččlan polja molan polja možže promijeniti mod? Ako je e promijeniti mod? Ako je a[na[n--1] != a[n1] != a[n--2]2]niti mod niti uniti mod niti uččestalost se ne mijenjaju. Ako jest jednak, kako estalost se ne mijenjaju. Ako jest jednak, kako razlikovati između razlikovati između 3 mogu3 mogućća slua sluččaja:aja:

a) a) nađen je novi modnađen je novi modb) mod je isti, ali se poveb) mod je isti, ali se poveććava uava uččestalost estalost ffc) nema promjene ni moda niti uc) nema promjene ni moda niti uččestalosti estalosti

Odgovor ovisi o tome je li Odgovor ovisi o tome je li a[na[n--1] == a[n1] == a[n--1 1 -- f]f]ako jest, onda ima ako jest, onda ima nn--1 1 -- (n(n--1 1 -- f) +1 = f + 1f) +1 = f + 1pojavljivanja vrijednosti koje je u pojavljivanja vrijednosti koje je u a[na[n--1]1]. To zna. To značči da je ta vrijednost i da je ta vrijednost sigurno ili novi mod ili stari mod s uvesigurno ili novi mod ili stari mod s uveććanom uanom uččestaloestaloššćću u ff..

Page 38: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 38 / 40

Zadaci za vjeZadaci za vježžbubu

Primjeri rekurzivnih poziva funkcijePrimjeri rekurzivnih poziva funkcijePrimjeriRekurzijePrimjeriRekurzije

Page 39: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 39 / 40

Zadaci za vjeZadaci za vježžbubu

Napisati program za raNapisati program za raččunanje binomnog koeficijenta koristeunanje binomnog koeficijenta koristećći izraz: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 Napisati funkciju koja ćće na zaslon ispisati prvih e na zaslon ispisati prvih nn redaka redaka Pascalovog trokuta.Pascalovog trokuta.

BinomniKoeficijentiBinomniKoeficijenti

PascalovTrokutRekurzijaPascalovTrokutRekurzija

Page 40: Algoritmi i strukture podataka - Računarstvo 550. semestar/Programiranje... · zneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju ... Zadaci za vježbu

Algoritmi i strukture podataka, 2006/07. 40 / 40

Problem trgovaProblem trgovaččkog putnikakog putnika

Problem trgovaProblem trgovaččkog putnika (TSP; 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, krenuvkrenuvšši iz zadanog grada, obii iz zadanog grada, obićći sve gradove toi sve gradove toččno jednom, tako da ukupni no jednom, tako da ukupni trotroššak puta bude najmanji. ak puta bude najmanji. cij = cjiTSP(Gi, G) = min (cij + TSP (Gj, G \ Gj))

jj

TSP(Gi, {Gj}) = cij

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

TSPjednostavniTSPjednostavni

TSP TSP –– ispisuje putispisuje put