Cum funcționează
Orice problemă recursivă are două părți: cazul de bază, în care funcția returnează direct un
rezultat, și pasul recursiv, în care funcția se apelează pe o variantă mai mică a problemei.
Aici pasul recursiv se bazează pe două operații pe care trebuie să le știi la atestat:
n % 10 — ultima cifră a lui n (restul împărțirii la 10)
n / 10 — numărul fără ultima cifră (împărțire întreagă)
Deci suma cifrelor lui n este ultima cifră, plus suma cifrelor a ceea ce rămâne. La fiecare
apel numărul se micșorează cu o cifră, până ajunge la 0 — momentul în care ne oprim.
Pentru p = 3815, apelurile se desfășoară așa:
sumaCifrelor(3815) = 5 + sumaCifrelor(381)
sumaCifrelor(381) = 1 + sumaCifrelor(38)
sumaCifrelor(38) = 8 + sumaCifrelor(3)
sumaCifrelor(3) = 3 + sumaCifrelor(0)
sumaCifrelor(0) = 0 ← cazul de bază
Rezultatele se adună la întoarcere: 0 + 3 + 8 + 1 + 5 = 17.
Greșeli frecvente
- Lipsa cazului de bază — funcția se apelează la infinit și programul se oprește cu eroare
(stack overflow). Cazul de bază se scrie întotdeauna primul.
n / 10 scris ca n / 10.0 — împărțirea devine reală, iar recursivitatea nu se mai
termină. La tipul int, 3815 / 10 dă exact 381.
- Confuzia dintre
% și / — % dă cifra, / scurtează numărul.
Variantă iterativă
Enunțul cere explicit recursivitate, dar merită să știi și forma cu while, pentru că
aceeași idee apare la multe alte probleme:
int suma = 0;
while (p != 0) {
suma += p % 10;
p /= 10;
}