Factorial — prima ta recursivitate

Bază~12 min9 pași

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:

  1. Cazul de bază — condiția de oprire (fără ea, funcția rulează la infinit)
  2. 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)!

Observația-cheie

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.

Indiciu

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;
}
Greșeli frecvente

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.