Rekurzivan kod i funkcije

Ekipa;

U kojim ste situacijama u vašoj programerskoj praksi upotrebljavali rekurzivne funkcije (koje pozivaju same sebe) i uopšteno koristili rekurzivni kod ? Ne mogu da nađem valjan kontekst kako to upotrijebiti. Da li je riječ o šemi tj “patternu” koji je uobičajan u programiranju ili je do programera da odluči hoće li upotrebljavati rekurzivan kod. Trebaju mi generalni koncepti koji nisu vezani ni za jedan jezik tj. mogu se primjeniti svugdje.

Hvala

Iz mog iskustva obicno gdje treba proci kroz neko stablo (listing direktorija, primjeri sa paskalovim trouglom i to) ili ima neki event loop.

najbolji primjer rekurzije ti je faktorijel. Pored rekurzivne implementacije postoji ekvivalentna iterativna implementacija. Evo ti link s primjerom, a javi ako ti treba iterativna posto imam primjer u knjizi iz osnova programiranja. http://grube.web.srk.fer.hr/marcupic/CTips/RekurzivneFunkcije.html
Edit: ne znam sad da li ovo ima veze s rekurzijom, ali npr kada hocu da ucitam neki live distro s usb, on kopira prvo listu argumenata, a zatim vrsi poziv funkcije, tj kopira sve u ram dok ne dodje do zadnjeg fajla, odnosno dok se ne popuni sav raspoloziv prostor u RAM memoriji. To mi lici na situaciju kada funkcija poziva samu sebe s druge memorijske lokacije.

Rekurziju je zgodno koristiti kada je ona prirodna. Recimo, proracunati funkciju za koju vrijedi f_(n+1) = l (f_n, f_n-1 …, f_0). Najcesce, funkcija samo prethodna dva clana. Kao sto rece neko, faktorijel je odlican primjer rekurzivnog problema.

Medjutim, bolje je koristiti iteracije kada si ogranicen memorijom, a i kada je brzina koda vazna.

U c+±u:

[code]#include

using namespace std;

int fakt (int n)
{
int rez = 1;
for (int i = 1; i <= n; i++)
{
rez *=i;
}
return rez;
}

int fakt2 (int n)
{
int rez = 1;
if (n == 1)
return 1;
else
return n*fakt2(n-1);
}

int main ()
{
int broj;
cin >> broj;
cout << "Faktorijel je: " << fakt (broj) << endl;
cout << "Faktorijel rekurzivno je: " << fakt2 (broj) << endl;

}[/code]

A evo ih u C-u:

[code]/* rekurzivno /
int rfac(int n)
{
return (n<2) ? 1 : n
rfac(n-1);
}

/* petljanjem /
int fac(int n)
{
int i=1;
while( (i
=n) && n–>1);
return i;
}[/code]
I ova druga je one-liner sa for petljom. Ovaj faktorijel meni uvijek bio nekako los primjer za rekurziju jer (iako je faktorijel matematicka rekurzija) meni se cini da petlja ispadne brza na kraju (il da ima vise smisla). I naravno, niko normalan ne bi ovdje koristio int jer on brzo “presushi” :slight_smile:

Binarno pretrazivanje:

int binSearch(int *p, int first, int last, int arg) { int mid; mid = ( first + last) / 2; if(*(p + mid) == arg) { return mid; } if(first >= last) { return -1; } if(*(p + mid) > arg) { return binSearch(p, first, mid-1, arg); } if(*(p + mid) < arg) { return binSearch(p, mid + 1, last, arg); } }

Quicksort

Moram ovih dana prionuti na Algorhitms And Data Structures. Nema druge.

Otprilike rekurziju je pogodno koristiti kada imas problem koji se moze podijeliti na vise dosta slicnih manjih problema. Teoretski svako rekurzivno rjesenje se moze odraditi i iterativno ali je nekad to prakticno uzasno tesko :slight_smile:
Ako se bavis izradom poslovnih informacionih sistema rijetko ces doci u situaciju da koristis rekurziju - a i ako dodjes mozda je bolje da koristis iterativno rjesenje (ukoliko se problem bas nije “ubio” za rekurziju kao neki od problema koji su spomenuti u threadu). TO je zbog toga sto je rekurzija jedna od dvije stvari koje vecina programera ne nauci (dobro), pa da bi olaksao svojim kolegama koji ce morati gledati kod poslije tebe.

Čuvena knjiga o algoritmima online (nije baš čitava i neki dijelovi su nedovršeni, ali i ovo je korisno):
http://algs4.cs.princeton.edu/home/

Kupio sam knjigu domaćeg autora - Dizajn algoritama i struktura podataka u knjižari. Sad se borim sa Euklidom :slight_smile: Ulazeći u vode programiranja mislio sam da mi algoritmi neće trebati. Ispostavilo se da neću moći da kažem da se bavim programiranjem ako ne naučim algoritme. Dobro je da mi je to veoma zanimljivo. Al sad je problem što moram da obnavljam (učim ponovo) matematiku. Evo malo se crvenim al sam mrzio matiš u školi - valjda zbog nastavnika i obrazovnog sistema.

[quote=testni_hamo2]Otprilike rekurziju je pogodno koristiti kada imas problem koji se moze podijeliti na vise dosta slicnih manjih problema. Teoretski svako rekurzivno rjesenje se moze odraditi i iterativno ali je nekad to prakticno uzasno tesko :slight_smile:
Ako se bavis izradom poslovnih informacionih sistema rijetko ces doci u situaciju da koristis rekurziju - a i ako dodjes mozda je bolje da koristis iterativno rjesenje (ukoliko se problem bas nije “ubio” za rekurziju kao neki od problema koji su spomenuti u threadu). TO je zbog toga sto je rekurzija jedna od dvije stvari koje vecina programera ne nauci (dobro), pa da bi olaksao svojim kolegama koji ce morati gledati kod poslije tebe.[/quote]
Pa jeste rekurzivni koncept malo teži za uhvatiti. Za sad sam se zadovoljio tumačenjem da je iteracija približavanje rješavanju problema na taj način da svaki korak vodi bliže i ukazuje na rješenje.A da je rekurzija ovo što si ti rekao - dijeljenje istog problema na manje odnosno pozivanje samog sebe do određene granice. Negdje sam pročitao da se rekurzija poredi sa ogledalom pa mi pade na pamet fotografija sa jednog pd prvih albuma Pink Floyda - Ummagamma

Ne treba da se crvenis. Ja sam imao 2 iz matematike u cetvrtom razredu, a sad studiram informatiku na odsjeku za matematiku i informatiku. I imao sam 8 matematika u toku studiranja. Kod mene je to bilo iskljucivo zbog profesora da ne ulazim u to sta je radio i kakav je bio.