Rekurzivno programiranje

Download Report

Transcript Rekurzivno programiranje

Glava 11
Rekurzija
Rekurzija
• Rekurzija je fundamentalna tehnika programiranja
koja moze dati elegantna rjesenja za neke klase
problema
• Glava 11 razmatra:




Razmisljanje u rekurzivnom stilu
Programiranje u rekurzivnom stilu
Korektna upotreba rekurzije
Primjeri rekurzije
© 2004 Pearson Addison-Wesley. All rights reserved
11-2
Pregled
Rekurzivno razmisljanje
Rekurzivno programiranje
Upotreba rekurzije
Rekurzija u grafici
© 2004 Pearson Addison-Wesley. All rights reserved
11-3
Rekurzivne tehnike
• Rekurzivna definicija je ona koja koristi rijec ili
koncept definisan pomocu vlastite definicije
• Kada definisemo neku englesku rijec, rekurzivna
definicija je cesto nekorisna
• Ali u drugim situacijama, rkurzivna definicija moze
na odgovarajuci nacin predstaviti koncept
• Prije primjene rekurzivnog programiranja najbolje
je vezbati rekurzivno razmisljanje
© 2004 Pearson Addison-Wesley. All rights reserved
11-4
Rekurzivne definicije
• Razmottrimo slijedecu listu brojeva:
24, 88, 40, 37
• Takva lista moze biti definisana kako slijedi:
LISTA
je:
ili:
broj
broj
zarez
LISTA
• To jest, LISTA je definisana kao jedan broj, ili kao
broj za kojim slijedi zarez iza koga je lista
• Koncept LISTA je koristen za definisanje samog
sebe
© 2004 Pearson Addison-Wesley. All rights reserved
11-5
Rekurzivne definicije
• Rekurzivni dio definicije LISTA koristi se
vise puta, zavrsavajuci sa ne-rekurzivnim
dijelom:
broj zarez LISTA
24
,
88, 40, 37
broj zarez LISTA
88
,
40, 37
broj zarez LISTA
40
,
37
broj
37
© 2004 Pearson Addison-Wesley. All rights reserved
11-6
Beskonacna rekurzija
• Sve rekurzivne definicije imaju ne-rekurzivni dio
• Ako nemaju, tada ne postoji nacin da se zavrsi
rekurzivni put
• Takva definicija mogla bi prouzrokovati
beskonacnu rekurziju
• Ovaj problem je slican beskonacnoj petlji, ali
“petlja” koja se ne zavrsava je dio same definicije
• Ne-rekurzivni dio cesto se naziva bazni slucaj
© 2004 Pearson Addison-Wesley. All rights reserved
11-7
Rekurzivne definicije
• N!, za pozitivan broj N, je definisan kao proizvod
svih cijelih brojeva izmedju 1 i N ukljucivo
• Ova se definicija moze predstaviti rekurzivno kao
as:
1!
N!
=
=
1
N * (N-1)!
• Faktorijal je definisan preko drugog faktorijala
• Nekada ce bazni slucaj 1! biti dostignut
© 2004 Pearson Addison-Wesley. All rights reserved
11-8
Rekurzivne definicije
5!
120
5 * 4!
24
4 * 3!
6
3 * 2!
2
2 * 1!
1
© 2004 Pearson Addison-Wesley. All rights reserved
11-9
Pregled
Rekurzivno razmisljanje
Rekurzivno programiranje
Upotreba rekurzije
Rekurzija u grafici
© 2004 Pearson Addison-Wesley. All rights reserved
11-10
Rekurzivno programiranje
• Metoda u Javi mmoze pozvati samu sebe; ako je
postavljena na taj nacin, tada se naziva rekurzivna
metoda
• Kod rekurzivne metode je struktuiran da obradjuje
i bazni slucaj i opsti slucaj
• Svaki poziv metode postavlja novu okolinu za
izvodjenje, sa novim parametrima i lokalnim
varijablama
• Kao i kod svakog poziva metode, kada se metoda
zavrsi, kontrola se vraca u metodu iz koje je bio
poziv (koja moze biti raniji poziv same sebe)
© 2004 Pearson Addison-Wesley. All rights reserved
11-11
Rekurzivno programiranje
• Razmotrimo problem sumiranja svih brojeva
izmedju 1 i nekog pozitivnog cijelog broja N
• Ovaj problem mozemo rekurzivno definisati kao:
N 1
N
i

N

i 1
i
N 2

N

N 1 
i 1
i
i 1
N 3

N

N 1 
N 2

i
i 1

© 2004 Pearson Addison-Wesley. All rights reserved
11-12
Rekurzivno programiranje
// Ovaj metod vraca sumu od 1 do num
public int sum (int num)
{
int result;
if (num == 1)
result = 1;
else
result = num + sum (n-1);
return result;
}
© 2004 Pearson Addison-Wesley. All rights reserved
11-13
Rekurzivno programiranje
result = 6
main
sum(3)
sum
result = 3
sum(2)
sum
result = 1
sum(1)
sum
© 2004 Pearson Addison-Wesley. All rights reserved
11-14
Rekurzivno programiranje
• Primijetimo da ako mi mozemo koristiti rekurziju
za rjesavanje problema, to ne znaci da trebamo
• Na primjer, mi obicno necemo koristiti rekurziju za
problem sumiranja brojeva od 1 do N, jer iterativna
verzija je jednostavnija za razumijevanje
• Ipak, za neke probleme, rekurzija daje elegantna
rjesenja, cesto cistija od iterativne verzije
• Vi morate pazljivo odluciti kada je rekurzija
korektna tehnika za rjesavanje nekog problema
© 2004 Pearson Addison-Wesley. All rights reserved
11-15
Indirektna rekurzija
• Metod koji poziva smog sebe smatra se direktnom
rekurzijom
• Neka metoda moze pozvati drugu metodu, koja
zove drugu, itd., dok napokon originalna metoda
ne bude ponovo pozvana
• Na primjer, metoda m1 moze pozvati m2, koja
poziva m3, koja sa svoje strane poziva m1 ponovo
• Ovo se naziva indirektna rekurzija, a zahtijeva istu
paznju kao i direktna rekurzija
• Ona je teza za pracenje i debagiranje
© 2004 Pearson Addison-Wesley. All rights reserved
11-16
Indirektna rekurzija
m1
m2
m3
m1
m2
m1
© 2004 Pearson Addison-Wesley. All rights reserved
m3
m2
m3
11-17
Pregled
Rekurzivno razmisljanje
Rekurzivno programmiranje
Upotreba rekurzije
Rekurzija u grafici
© 2004 Pearson Addison-Wesley. All rights reserved
11-18
Obilazak lavirinta
• Mozemo koristiti rekurziju za nalazenje puta kroz
lavirint
• Iz svake lokacije mozemo pretrazivati u svakom
pravcu
• Rekurzija pamti trag puta kroz lavirint
• Osnovni slucaj je pogresan potez ili dostizanje
krajnje destinacije
• Vidi MazeSearch.java (strana 583)
• Vidi Maze.java (strana 584)
© 2004 Pearson Addison-Wesley. All rights reserved
11-19
Hanojske kule
• Hanojske kule je problem sa tri vertikalna stapa i
vise diskova koji su na stapovima
• Diskovi su raznih velicina, na pocetku smjesteni
na jedan stap sa najvecim diskom na dnu i sa
strogo sve manjim diskovima prema vrhu
• Cilj je prebaciti sve diskove sa jednog stapa na
drugi po slijedecim pravilima:
 Mozemo premjestiti samo jedan disk u jednom potezu
 Ne mozemo staviti veci disk na manji disk
© 2004 Pearson Addison-Wesley. All rights reserved
11-20
Hanojske kule
Originalna konfiguracija
Potez 1
Potez 2
Potez 3
© 2004 Pearson Addison-Wesley. All rights reserved
11-21
Hanojske kule
Potez 4
Potez 5
Potez 6
Potez 7 (gotovo)
© 2004 Pearson Addison-Wesley. All rights reserved
11-22
Hanojske kule
• Iterativno rjesenje problema hanojskih kula je
veoma slozeno
• Rekurzivno rjesenje je krace i elegantnije
• Vidi SolveTowers.java (strana 590)
• Vidi TowersOfHanoi.java (strana 591)
© 2004 Pearson Addison-Wesley. All rights reserved
11-23
Pregled
Rekurzivno razmisljanje
Rekurzivno programiranje
Koristenje rekurzije
Rekurzija u grafici
© 2004 Pearson Addison-Wesley. All rights reserved
11-24
Poplocane slike
• Razmotrimo posao ponavljanog prikazivanja
skupa slika u mozaiku
 Tri kvadranta sadrze individualne slike
 Gornj-lijevi kvadrant predstavlja uzorak
• Osnovni slucaj se dostize kada se oblast za slike
suzi na odredjenu velicinu
• Vidi TiledPictures.java (strana 594)
© 2004 Pearson Addison-Wesley. All rights reserved
11-25
Poplocane slike
© 2004 Pearson Addison-Wesley. All rights reserved
11-26
Fraktali
• Fractal je geometrijski oblik sastavljen od istih
uzoraka u razlicitim velicinama i orijentaciji
• Koch-ova pahuljica partikularni fraktal koji pocinje
sa jednakostranicnim trouglom
• Za dobivanje fraktala viseg reda, strane trougla su
zamijenjene sa uglastim segmentima linija
• Vidi KochSnowflake.java (strana 597)
• Vidi KochPanel.java (strana 600)
© 2004 Pearson Addison-Wesley. All rights reserved
11-27
Koch-ova pahuljica
< x5 , y5 >
< x 5 , y5 >
< x 4 , y4 >
Becomes
< x3 , y 3 >
< x 2 , y2 >
< x1 , y1 >
© 2004 Pearson Addison-Wesley. All rights reserved
< x 1 , y1 >
11-28
Koch-ova pahuljica
© 2004 Pearson Addison-Wesley. All rights reserved
11-29
Koch-ova pahuljica
© 2004 Pearson Addison-Wesley. All rights reserved
11-30
Zakljucak
• Glava 11 razmatra:




Razmisljanje na rekurzivan nacin
Programiranje na rekurzivan nacin
Korektna upotreba rekurzije
Primjeri rekurzije
© 2004 Pearson Addison-Wesley. All rights reserved
11-31