ana spasić -...

16
Ana Spasić 21. Mart 2011.

Upload: others

Post on 08-Sep-2019

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Ana Spasić

21. Mart 2011.

Page 2: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Rekurzija�� RekurzijaRekurzija je programerska tehnika pri kojoj:

� F-ja u svojoj definiciji direktnodirektno poziva samu sebe.

� F-ja indirektnoindirektno poziva samu sebe, npr. Fja f poziva fju g, koja poziva fju f.

� Ovakav pristup programiranju se često koristi prilikom � Ovakav pristup programiranju se često koristi prilikom rešavanja problema koji imaju po prirodi rekurzivnu definiciju. To su problemi kod koji se problem dimenzije n jednostavno svodi na problem dimenzije n-1 ili jos manje.

� Kako se definiše faktorijel?

� Kako bi izgledala iterativna, a kako rekurzivna verzija funkcije int faktorijel( int n)int faktorijel( int n)?

21.03.2011. Rekurzija 2

Page 3: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Rekurzivni pozivi i stek� Stek je struktura podataka u koju se novi podaci uvek dodaju na

vrh, a prilikom uklanjanja isto skida se poslednji dodat. Zato se kaže da je stek LIFO struktura. (Last In First Out).

� Prilikom poziva funkcije, na stek se prvo stavljaju argumenti funkcije, onda adresa povratka, nakon čega jeprostor za lokalne promenljive pozvane funkcije.promenljive pozvane funkcije.

� Svi rekurzivni pozivi se čuvaju nasteku. Kada se pozove funkcija sa trivijalnim slucajem, izvrši se, a onda se naredbom return stek element za taj poziv skida sa steka i ide na adresu povratka, tj.na instrukciju iz ranijeg poziva iz

kojeg je pozvana. 21.03.2011. Rekurzija 3

Page 4: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

� Zadatak 1.

a) Napisati rekurzivnu funkciju koja štampa brojeve između0 i n.

b) Napisati rekurzivnu funkciju koja štampa brojeve izmedun i 0.

� 06_01.c

� Šta bi se dogodilo ako bismo izostavili izlazak iz rekurzije?

� Da li je provera uslova n = -1 dobar izlazak iz rekurzije?

29.03.2011 Rekurzija 4

Page 5: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

� Zadatak 2.

Napisati rekurzivnu funkciju koja izračunava xk, za dati realnibroj x i prirodan broj k.

� Kako izgleda iterativno rešenje?

� Linearno rešenje se zasniva na činjenici: xk = x * xk-1

� Logaritamsko rešenje je zasnovano na činjenicama:� Logaritamsko rešenje je zasnovano na činjenicama:

� xk = x * (x2)k/2 , za neparno k

� xk = (x2)k/2 , za parno k

� Prirodno, logaritamskom rešenju će biti potrebno manjerekurzivnih poziva da bi došlo do rešenja, i stoga je efikasnije.

� Broj uzastonih rekurzivnih poziva se naziva dubina rekurzije.

21.03.2011. 5Rekurzija

Page 6: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Repna rekurzija (tail recursion)

�� RepnoRepno--rekurzivnarekurzivna je ona funkcija čije se telo završava rekurzivnim pozivom, pri čemu taj rekurzivni poziv ne učestvuje u nekom izrazu.

� Kod ovih funkcija se po završetku za tekući rekurzivni � Kod ovih funkcija se po završetku za tekući rekurzivni poziv umesto skoka na adresu povratka skače na adresu povratka za prethodni poziv, odnosno za poziv na manjoj dubini. Time se štedi i prostor i vreme.

� Ovakve funkcije se mogu lako zameniti odgovarajućom iterativnom funkcijom.

21.03.2011. Rekurzija 6

Page 7: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

� Zadatak 3.

Napisati repno-rekurzivnu funkciju koja izračunava n!.

� 06_03.c

� Uočite razliku u poslednjoj instrukcije u telu rekurzivnih � Uočite razliku u poslednjoj instrukcije u telu rekurzivnih funkcija faktorijel i faktorijelRepna.

21.03.2011. Rekurzija 7

Page 8: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Zadatak 4.� Paskalov trougao se dobija tako što mu je svako polje

(izuzev 0-te vrste i 0-kolone) zbir jednog polja levo ijednog polja iznad.

1 1 1 1 1 1

1 2 3 4 5

1 3 6 10

1 4 10

1 5

1

a) Napisati rekurzivnu funkciju koja izracunava dn kao sumuelemenata n-te hipotenuze pravouglog trougla.

b) Napisati rekurzivnu funkciju koja izracunava vrednost polja (i, j).

21.03.2011. Rekurzija 8

Page 9: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Zadatak 5.� Napisati rekurzivnu funkciju koja sabira niz celih brojeva.

� Niz od n elemenata: a[0], a[1], … , a[n-2], a[n-1]

� 1. način:

� Suma elemenata niza dimenzije n = 0, biće 0,� Suma elemenata niza dimenzije n = 0, biće 0,

� za n > 0, suma = suma_prvih_n-1_elemenata + a[n-1]

� 2. način:

� Suma elemenata niza dimenzije n = 0, biće 0,

� za n > 0, suma = a[0] + suma_ostalih_n-1_elemenata

� 06_05.c

21.03.2011. Rekurzija 9

Page 10: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Zadatak 6.� Napisati rekurzivnu funkciju koja računa n-ti element u

Fibonačijevom nizu. Popraviti funkciju tako da se problemimanje dimenzije rešavaju samo jedan put.

� F(0) = F(1) = 1

� F( n) = F(n-1) + F(n-2)

�� Dinamičko programiranje Dinamičko programiranje nam omogućava da samo jednom rešavamo potprobleme. Već izračunate članove niza čuvamo u statičkom nizu celih brojeva, jer taj niz onda neće biti smešten na stek već u statičkoj memoriji odakle će biti dostupan svim pozivima rekurzivne funkcije.

� 06_06.c

21.03.2011. Rekurzija 10

Page 11: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Zadatak 7.� Napisati rekurzivnu funkciju koja računa sumu elemenata

na parnim pozicijama u nizu celih brojeva.

� 06_07.c

� Funkcija je posrednoposredno rekurzivnarekurzivna.

Rekurzija se ostvaruje preko posredno rekurzivne funkcijeRekurzija se ostvaruje preko posredno rekurzivne funkcijekoja računa sumu elemenata na neparnim pozicijama.

21.03.2011. Rekurzija 11

Page 12: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Zadatak 8.� Napisati rekurzivnu funkciju koja prikazuje sve

permutacije skupa {1, 2, ... ,n}.

� 06_08.c

� Za n=3

1 2 31 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

21.03.2011. Rekurzija 12

Page 13: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Bitno!� Kad pišemo rekurzivnu funkciju moramo da obezbedimo:

�� Izlazak iz rekurzijeIzlazak iz rekurzije, obično trivijalnim slučajem.

�� Rekurzivni poziv Rekurzivni poziv kojim se rešava problem manje dimenzije.

� Rekurzija nam omogućava pisanje elegantnijih rešenja.

� Rekurzivne funkcije troše mnogo više memorije nego � Rekurzivne funkcije troše mnogo više memorije nego iterativne koje rešavaju isti problem.

21.03.2011. Rekurzija 13

Page 14: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Rekurzivne funkcije pretrage� Napisati rekurzivne implementacije funkcija za linearnu i

binarnu pretragu.

� 07_01.c

Rekurzivne funkcije sortiranja

21.03.2011. Rekurzija 14

Rekurzivne funkcije sortiranja• Napisati rekurzivne implementacije funkcija za sortiranje(selection, insertion) niza celih brojeva.• 07_02.c

Page 15: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Merge sortMerge sort –– sortiranje učešljavanjemsortiranje učešljavanjem

1. Prazan niz i niz od samo 1 elementa su vec sortirani.

2. Niz se deli na dva podniza sa približno jednakim brojem elemenata.

3. Rekurzivno se sortiraju oba podniza.3. Rekurzivno se sortiraju oba podniza.

4. Konacan sortirani se dobija spajanjem elementa dva podniza koji su već sortirani u odgovarajućem poretku.

� Primer: 7, 13, 35, 14, 24, 31, 3, 18, 11, 2, 21

� Složenost algoritma merge sort je O(n * logn).

� 07_03.c

21.03.2011. Rekurzija 15

Page 16: Ana Spasić - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~aspasic/arhiva/2012_2013/prog2/vezbe/06/p2_06.pdfRekurzivni pozivi i stek Stek je struktura podataka u koju se novi podaci

Quick sort� U svakom koraku se bira jedan element niza – pivot.

Znamo da će u sortiranom nizu svi elementi manji od pivota biti levo od njega i isto tako svi veći od pivota će biti na pozicijama desno. Dakle, transformišemo početni niz tako da važi prethoda relacija između pivota i ostalih niz tako da važi prethoda relacija između pivota i ostalih elemenata niza. Potom, rekurzivno pozivamo funkciju sortiranja da bismo sortirali levu polovinu, a zatim je pozivamo da bismo sortirali polovnu niza desno od pivota.

� Složenost algoritma quick sort je O(n * logn).

� 07_04.c

21.03.2011. Rekurzija 16