Informatică, întrebare adresată de Zlatan, 9 ani în urmă

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 antonii
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)


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
Zlatan: Apoi "se intoarce" si calculeaza toate valorile. Spre exemplu,pentru a calcula fact(4),trebuie sa stiu fact(3),care a fost calculat inainte,nu?
antonii: da.exact
Alte întrebări interesante