4 Rekurzija 4 1 O rekurziji Rekurzija je

  • Slides: 12
Download presentation
4. Rekurzija 4. 1. O rekurziji Rekurzija je opšti metod koji se koristi za

4. Rekurzija 4. 1. O rekurziji Rekurzija je opšti metod koji se koristi za rešenje velike klase zadataka u računarstvu. Objekat se naziva rekurzivnim ako sadrži manju verziju samoga sebe ili se definiše pomoću svoje manje verzije. Na primer: Moć rekurzije leži u preciznom definisanju beskonačnog skupa objekata pomoću konačnog skupa izkaza.

Rekurzija se realizje preko funkcija. U opštem slučaju, rekurzivna definicija sadrži 2 dela: •

Rekurzija se realizje preko funkcija. U opštem slučaju, rekurzivna definicija sadrži 2 dela: • nerekurzivni deo, koji omogućava izlazak iz kružnog definisanja (osnovni slučaj), • rekurzivni deo u kojem se objekat definiše pomoću samoga sebe (opšti slučaj). Rekurzija, kao metod, prirodno se primenjuje na objekte koji su rekurzivno definisani. Da bi se primenjivala rekurzija potrebno je: • da postoji osnovni slučaj • da se pravi progres ka osnovnom slučaju (u procesu primene) • da se svaki rekurzivni poziv realizuje korektno.

4. 2. Primeri rekurzivnih programa Primer 1. Računanje faktorijela Fakt. cpp Primer 2. Računanje

4. 2. Primeri rekurzivnih programa Primer 1. Računanje faktorijela Fakt. cpp Primer 2. Računanje broja cifara celog broja n. Broj. Cifara. cpp U prethodnim primerima funkcija direktno poziva samu sebe. Tako realizovana rekurzija često se naziva samorekurzija.

4. 3. Uzajamna rekurzija Ukoliko funkcija ne poziva direktno samu sebe, već poziva neku

4. 3. Uzajamna rekurzija Ukoliko funkcija ne poziva direktno samu sebe, već poziva neku drugu funkciju, a ova neku treću itd. do n-te. Ako n-ta funkcija poziva prvu, onda opet imamo posla sa rekurzijom (prva funkcije indirektno poziva samu sebe). Ovakva vrsta rekurzije naziva se uzajamna rekurzija. f 1 f 2 . . . fn Neka imamo sledeći zadatak: Zadatak 1. Izračunati : Uzrec. cpp

4. 4. Rekurija i (ili) iteracija Rekurzija, kao i iteracija predstavlja opšti metod za

4. 4. Rekurija i (ili) iteracija Rekurzija, kao i iteracija predstavlja opšti metod za nalaženje rešenja velikog broja zadataka. Svuda gde se primenjuje iteracija, može se primeniti i rekurzija. Važi i obrnuto. Primer 3. Napisati iterativni i rekurzivni metod za računanje n-tog korena datog pozitivnog broja a. Za računanje n-tog korena koristećemo Njutnovu formulu: Početna iteracija y 0 bira se proizvoljno. Izračuanavanje ćemo realizovati sa mašinskom tačnošću. Nti. Rec. cpp Nti. Iter. cpp

4. 5. Kada ne treba koristiti rekurziju? Primer 4. Fibonačijevi brojevi se definišu na

4. 5. Kada ne treba koristiti rekurziju? Primer 4. Fibonačijevi brojevi se definišu na sledeći način: Navedena definicija je rekurzivna pa se prirodno nameće korišćenje rekurzije. Fib. cpp, Fib 1. cpp Međutim, iteracija ovde daje znatno bolje rezultate. Fib. Iter. cpp Ako se pogleda način računanja nekog Fibonačijevog broja rekurzivnim putem, jasno je zašto iteracija daje znatno bolje rezultate.

Računanje 5. Fibonačijevog broja rekurzivnim putem. fib(5) fib(4) fib(3) fib(2) fib(1) fib(0) fib(1) fib(2)

Računanje 5. Fibonačijevog broja rekurzivnim putem. fib(5) fib(4) fib(3) fib(2) fib(1) fib(0) fib(1) fib(2) fib(1) fib(0) Računanjefib(20) zahteva 21891 poziva funkcije fib, dok računanje fib(30) zahteva 2692537 poziva funkcije fib.

4. 6. Kada koristiti rekurziju? Zadatak 2. Napistai program za računanje stepena xn za

4. 6. Kada koristiti rekurziju? Zadatak 2. Napistai program za računanje stepena xn za dato realno x 0 i n N. Zadatak možemo rešiti rekurzivnim postupkom: Stepen. Rec. cpp Međutim, ovde je mnogo efikasniji itertivni algoritam. Stepen. It. cpp (Napomena: ovde je korišćen isti interfejs, ali različite su realizacije metoda. ) Da li se može kreirati efikasniji rekurzivni potupak za rešenje postavljenog zadatka? Stepen xn možemo definisati na sledeći način:

Ova definicija vodi direktno do mnogo efikasnijeg rekurzivnog postupka: Stepen. Rec. cpp Zašto je

Ova definicija vodi direktno do mnogo efikasnijeg rekurzivnog postupka: Stepen. Rec. cpp Zašto je ovaj postupak mnogo efikasniji? U 1. rešenju (Stepen 1) rekurzija se primenjuje tako što se problem svodi na verziju koja je neznatno jednostavnija od originalne. Potreno je izvršiti n množenja, što dovodi do velikog broja rekurzivnih poziva. Međutim, u ovom primeru problem se u jednom koraku redukuje na dvostruko jednostavniju verziju. Princip koji je korišćen u realizaciji ovog algoritma je ‘’podeli pa pobedi’’ (divide and conquer). Ovde je potrebno izvršiti približno log(n) množenja.

Kada se u rekurzivnoj realizaciji koristi iterativni algoritam, rekurzivni postupak je neefikasan (tada je

Kada se u rekurzivnoj realizaciji koristi iterativni algoritam, rekurzivni postupak je neefikasan (tada je prirodnije koristiti iteraciju). Međutim, ako se može pronaći drugačiji algoritam (kao u prethodnom primeru) koji je dovoljno efikasan, onda ima smisla primenjivazi rekurziju. Ponekad je mnogo jednostavnije realizovati rekurzivni postuak za rešenje nekog zadatka, nego li iterativni. Zadatak 3. Napisati program za rešenje problema ‘Hanojske kule’. (Opis problema) Hanoj. K. cpp A B C

Slična je situacija u sledećem primeru. Ovde se javlja tzv. dvostruka rekurzija, tj. kao

Slična je situacija u sledećem primeru. Ovde se javlja tzv. dvostruka rekurzija, tj. kao argument javlja se rekurzivna funkcija koju treba računari. Zadatak 4. Napisati metod za računanje Akermanove funkcije. Akermanova funkcija s eračuna prema sledećoj formuli: Akerman. cpp NAPOMENA: Akermanova funkcija ima važnu ulogu u teoriji rekurzivnih funkcija jer se pomoću nje može predstaviti sabiranje stepenovanje i množenje.

4. 7. Pretraživanje i sortiranje zasnovano na rekurziji Neki postupci pretraživanja i sortiranja po

4. 7. Pretraživanje i sortiranje zasnovano na rekurziji Neki postupci pretraživanja i sortiranja po svojoj prirordi su rekurzivni. U takvim postupcima prirodno se primenjuje rekurzija. 4. 7. 1. Binrno pretraživanje zasnovano na rekurziji. binrek. cpp, binrek 1. cpp, . . 4. 7. 2. Quick-sort algoritam Opisa algoritma za brzo sortiranje. qsort. cpp. qsor 1. cpp, qsort 2. cpp