De ce contează?
Cât face 5!? Dacă știi că 4! = 24, atunci 5! = 5 × 24 = 120. Asta e recursivitatea: rezolvi o problemă mare folosind soluția uneia mai mici.
Ce este recursivitatea?
O funcție este recursivă când se apelează pe ea însăși cu un argument mai mic. Orice recursivitate are două părți obligatorii:
- Cazul de bază — condiția de oprire (fără ea, funcția rulează la infinit)
- Pasul recursiv — problema se reduce la o versiune mai mică
Factorialul
Definiția matematică:
n! = n × (n-1) × ... × 2 × 1
0! = 1 (prin convenție)Rescrisă recursiv: n! = n × (n-1)!
Cazul de bază este 0! = 1. Fără el, funcția ar apela (-1)!, (-2)!, ...
până la stack overflow.
Implementare recursivă C++
#include <iostream>
using namespace std;
long long factorial(int n) {
if (n == 0) return 1; // caz de baza
return n * factorial(n - 1); // pas recursiv
}
int main() {
cout << factorial(5) << endl; // 120
cout << factorial(10) << endl; // 3628800
return 0;
}Stiva de apeluri
Când apelăm factorial(4), calculatorul face:
factorial(4)
→ 4 * factorial(3)
→ 3 * factorial(2)
→ 2 * factorial(1)
→ 1 * factorial(0)
→ 1 (caz de baza)Răspunsurile se întorc în ordine inversă: 1 → 1 → 2 → 6 → 24.
Vizualizează recursivitatea ca o stivă de scrisori: pui câte una pe stivă (apeluri recursive), iar când ajungi la bază le deschizi de sus în jos (returnuri).
Vizualizare
Urmărește cum fiecare apel factorial(n) se adaugă pe stivă până la cazul de bază, apoi cum returnurile se înmulțesc înapoi, de jos în sus:
Implementare iterativă (comparație)
long long factorialIterativ(int n) {
long long rezultat = 1;
for (int i = 2; i <= n; i++) {
rezultat *= i;
}
return rezultat;
}int depășește la 13! (2.147.483.647 < 6.227.020.800). Folosește long long
pentru n ≥ 13. La n ≥ 21, nici long long nu ajunge — folosește big integer
sau lucrul modulo un număr prim.