Napisati rekurzivnu i iterativnu funkciju koja računa faktorijal cijelog broja. Ispisati rezultat.
Hvala unaprijed svima.
To je osnovni primjer rekurzije koji se može naći na milijun mjesta na netu. Potraži.
Faktorijela nekog pozitivnog cijeloga broja ti je umnozak svih brojeva izmedu jedan i toga broja. Oznacava se tako da poslije broja stavis usklicnik, pa je tako faktorijelu od broja x pisemo x! .
x! = 1*2*... * x
5! = 1 * 2 * 3 * 4 * 5 = 120
3! = 1 * 2 * 3 = 6
I jos je definirano da je 0! = 1, a faktorijele od negativnih brojeva ne postoje.
Sada cemo napisati funkciju za racunanje faktorijele nekoga cijeloga broja. Nazvat cemo je faktorijela, i jedini argument koji ce primati ce biti broj od kojeg racunamo faktorijelu. Dakle njezin potpis ce izgledati ovako:
long faktorijela(int broj);
Faktorijelu nekoga broja mozemo izracunati na vise nacina. Jedan nacin je iterativni, tj. da pomocu jednostavne for petlje mnozimo sve brojeve od 1 do broja. To bi ovako izgledalo:
long faktorijela(int broj){
int rezultat = 1, i;
for(i = 1; i <= broj; i++){
rezultat *= i;
}
return rezultat;
}
Drugi nacin je da to promatramo kao rekurzivnu funkciju. To se temelji na tome da faktorijelu nekoga broja x mozemo napisati i ovako: x! = x * (x-1)!. Npr.
50! = 50 * 49!
49! = 49 * 48!
48! = 48 * 47!
I tako sve dok ne dodemo do nula rekurzija prestaje jer znamo da je 0! = 1. Dakle u nasem slucaju to pisemo ovako:
long faktorijela(int broj){
if(broj == 0)
return 1;
else
return (broj * faktorijela(broj-1));
}
U praksi se oba nacina svode na isto, no razlika je u tome sto je drugi nacin lakse napisati(ako koristis ternarni operator moze se cak i u jednome redu napisati). I u drugom nacinu ima puno vise poziva funkcija nego u prvome gdje imas samo jedan poziv funkcije. Ne znam koliko to utjece na perfomanse, no znam da to moze pri vecim brojevima napuniti stack i uzrokovati stack overflow gresku.