Definitia recursiva a factorialului :
unsigned long fact( int n )
{
if(!n) return 1;
return n*fact(n-1);
}
Definitia e ok. Dar cum ruleaza daca apelez,de exemplu,pentru n=6? Ce pasi se fac mai exact? Multumesc !
Răspunsuri la întrebare
Răspuns de
0
E asa de greu?
Functia recursiva practic se reapeleaza. Cand face asta executia in functia mama e blocata si se ruleaza noua functie (apelata).
De asemenea fucntia TREBUIE sa aiba o conditie de iesire (altfel va rula la nesfarsit).
In cazul tau conditia de iesire e n=0. (de aici -->if(!n)...). Daca n nu e zero atunci inmulteste n cu f(n-1). Daca te uiti bine o sa-ti dai seama de ceva. Apeland functia fact(3) (ex.) atunci 3 va fi inmultit cu 2 si ,cand n ajunge 0 , cu 1.
Poti vizualiza astfel(alt exemplu):
fact(5)-> n=5 (n e dif. de 0) =>5*fact(5-1)=5*fact(4)
fact(4)-> n=4 =>4*fact(3)
....
fact(0)-> n e zero deci va da return 1.
Si acum poti spune ca fiecare functie intra in colaps. Odata ce fact(0) a returnat 1 (si incheie ciclul) fiecare alta functie deschisa (cu n-ul 1,2,3,4 si 5) se va termina. Asa ca fact(1)=n*fact(0)=1*1
fact(2)=2*fact(1)=2*1
fact(3)=3*fact(2)=6
fact(4)=4*fact(3)=24
fact(5)=5*fact(4)=120
(observi ca fact(5) nu va da niciun return pana cand fact(4) nu da return ...si tot asa)
Functia recursiva practic se reapeleaza. Cand face asta executia in functia mama e blocata si se ruleaza noua functie (apelata).
De asemenea fucntia TREBUIE sa aiba o conditie de iesire (altfel va rula la nesfarsit).
In cazul tau conditia de iesire e n=0. (de aici -->if(!n)...). Daca n nu e zero atunci inmulteste n cu f(n-1). Daca te uiti bine o sa-ti dai seama de ceva. Apeland functia fact(3) (ex.) atunci 3 va fi inmultit cu 2 si ,cand n ajunge 0 , cu 1.
Poti vizualiza astfel(alt exemplu):
fact(5)-> n=5 (n e dif. de 0) =>5*fact(5-1)=5*fact(4)
fact(4)-> n=4 =>4*fact(3)
....
fact(0)-> n e zero deci va da return 1.
Si acum poti spune ca fiecare functie intra in colaps. Odata ce fact(0) a returnat 1 (si incheie ciclul) fiecare alta functie deschisa (cu n-ul 1,2,3,4 si 5) se va termina. Asa ca fact(1)=n*fact(0)=1*1
fact(2)=2*fact(1)=2*1
fact(3)=3*fact(2)=6
fact(4)=4*fact(3)=24
fact(5)=5*fact(4)=120
(observi ca fact(5) nu va da niciun return pana cand fact(4) nu da return ...si tot asa)
Zlatan:
Mersi! :D Adica eu cand apelez fact(6) , operatia va fi 6*fact(5),dar pentru a calcula fact(5) am nevoie de fact(4) si tot asa,pana la 0 ( unde functia da return 1). Apoi
Alte întrebări interesante
Limba română,
8 ani în urmă
Limba română,
8 ani în urmă
Geografie,
8 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă