Teorie despre subprograme recursive
Subprogramele recursive sunt funcții care se autoapelează pentru a rezolva o problemă. Ele sunt utile atunci când problema poate fi împărțită în subprobleme de același tip.
O funcție recursivă trebuie să aibă un caz de bază care oprește recursivitatea. În lipsa acestuia, funcția poate intra într-un ciclu infinit și poate cauza stack overflow.
Exemplu de caz de bază: pentru factorial, dacă n==0, returnăm 1.
Al doilea element este apelul recursiv: funcția se apelează pe sine cu parametri mai simpli, până când se ajunge la cazurile de bază.
Recursivitatea poate fi directă (funcția se apelează pe sine) sau indirectă (funcția A apelează B, care apelează A).
Fiecare apel recursiv creează un cadru activ în stiva de apeluri, care reține valorile parametrilor și variabilelor locale.
Execuția unui apel recursiv continuă după autoapel, începând cu instrucțiunea următoare apelului.
Stiva de apeluri este importantă pentru înțelegerea recursivității: ultima funcție apelată este prima care își termină execuția (LIFO).
Recursivitatea este utilă pentru probleme matematice (factorial, Fibonacci), algoritmi de sortare (merge sort, quick sort) și parcurgerea structurilor de date (liste, arbori).
Avantaje: cod mai scurt, logică clară pentru probleme repetitive.
Dezavantaje: poate consuma multă memorie, performanță mai scăzută decât iterativ în unele cazuri.
Exemple de funcții recursive: calcul factorial, calcul suma numerelor naturale, afișarea cifrelor unui număr, inversarea unui șir de caractere.
Este important să înțelegem cum se modifică stiva la fiecare apel și cum se construiește rezultatul pe măsură ce execuția revine din apelurile recursive.
Debugging-ul recursivității se face de obicei urmărind stiva de apeluri și output-ul fiecărui pas.
Recursivitatea poate fi combinată cu condiții și bucle interne pentru a rezolva probleme mai complexe.
Exercițiile practice ajută la consolidarea conceptului și la înțelegerea fluxului de execuție.
În concluzie, recursivitatea este un instrument puternic, dar trebuie folosit cu atenție la cazurile de bază și gestionarea stivei de apeluri.
Exemple de funcții recursive rezolvate
Funcția 1 – Exemplu cu stivă și output (cadre active)
void f1(int x) {
while(x>2) {
x--;
f1(x);
}
cout << x;
}
int main() {
f1(5);
}
| Pas | Stivă (sus = top) | Output | Observație |
|---|---|---|---|
| 1 | [f(3) x=4] | - | f(5): x=5>2 adevărat, x=x-1 → x=4, autoapel f(3), punem f(3) cu x=4 în stivă |
| 2 | [f(1) x=2, f(3) x=4] | - | f(3): x=3>2 adevărat, x=x-1 → x=2, autoapel f(1), punem f(1) cu x=2 în stivă |
| 3 | [f(1) x=2, f(3) x=4] | 1 | f(1): 1>2 fals, cout<<1, scoatem f(1) cu x=2 din stivă |
| 4 | [f(3) x=4] | 1 2 | Continuăm după autoapel cu f(1) și x=2: test while 2>2 fals, cout<<2, scoatem f(3) cu x=4 din stivă |
| 5 | [f(2) x=3] | 1 2 | Continuăm după autoapel cu f(3) și x=4: test while 4>2 adevărat, x=x-1 → x=3, autoapel f(2), punem f(2) cu x=3 în stivă |
| 6 | [f(1) x=2, f(2) x=3] | 1 2 | Continuăm după autoapel cu f(2) și x=3: x=2>2 fals, autoapel f(1), punem f(1) cu x=2 în stivă |
| 7 | [f(1) x=2, f(2) x=3] | 1 2 1 | Continuăm după autoapel cu f(1) și x=2: 1>2 fals, cout<<1, scoatem f(1) cu x=2 din stivă |
| 8 | [f(2) x=3] | 1 2 1 2 | Continuăm după autoapel cu f(1) și x=2: test while 2>2 fals, cout<<2, scoatem f(2) cu x=3 din stivă |
| 9 | [f(1) x=2] | 1 2 1 2 | Continuăm după autoapel cu f(2) și x=3: test while 3>2 adevărat, x=x-1 → x=2, autoapel f(1), punem f(1) cu x=2 în stivă |
| 10 | [f(1) x=2] | 1 2 1 2 1 | Continuăm după autoapel cu f(1) și x=2: 1>2 fals, cout<<1, scoatem f(1) cu x=2 din stivă |
| 11 | [] | 1 2 2 1 2 | Continuăm după autoapel cu f(1) și x=2: test while 2>2 fals, cout<<2, execuția f(5) se termină |
Output final: 1 2 2 1 2 ✅
Funcția 2 – Exemplu simplu
void f2(int x) {
if(x<=0) return;
cout << x << " ";
f2(x-1);
}
int main() {
f2(4);
}
| Pas | Stivă (sus = top) | Output | Observație |
|---|---|---|---|
| 1 | [f2(4)] | 4 | Apel f2(4): x>0 adevărat, cout<<x → 4, autoapel f2(3), punem f2(3) în stivă |
| 2 | [f2(3)] | 4 3 | Continuăm după autoapel cu f2(3): cout<<3, autoapel f2(2), punem f2(2) în stivă |
| 3 | [f2(2)] | 4 3 2 | Continuăm după autoapel cu f2(2): cout<<2, autoapel f2(1), punem f2(1) în stivă |
| 4 | [f2(1)] | 4 3 2 1 | Continuăm după autoapel cu f2(1): cout<<1, autoapel f2(0), scoatem f2(1) din stivă |
| 5 | [] | 4 3 2 1 | Continuăm după autoapel cu f2(0): x<=0 fals, execuția se termină |
Output final: 4 3 2 1 ✅
Funcția 3 – Exemplu simplu
void f3(int x) {
if(x<=1) return;
f3(x-1);
cout << x << " ";
}
int main() {
f3(4);
}
| Pas | Stivă (sus = top) | Output | Observație |
|---|---|---|---|
| 1 | [f3(4)] | - | Apel f3(4): x>1 adevărat, autoapel f3(3), punem f3(3) în stivă |
| 2 | [f3(3)] | - | Continuăm după autoapel cu f3(3): autoapel f3(2), punem f3(2) în stivă |
| 3 | [f3(2)] | - | Continuăm după autoapel cu f3(2): autoapel f3(1), punem f3(1) în stivă |
| 4 | [] | 2 | Continuăm după autoapel cu f3(1): x<=1 adevărat, return, cout<<x=2, scoatem f3(2) din stivă |
| 5 | [] | 2 3 | Continuăm după autoapel cu f3(2): cout<<x=3, scoatem f3(3) din stivă |
| 6 | [] | 2 3 4 | Continuăm după autoapel cu f3(3): cout<<x=4, scoatem f3(4) din stivă |
Output final: 2 3 4 ✅
Funcții recursive – execuție pas cu pas
Funcția 4: cout după autoapel
void exemplu3a(int x) {
if(x<=0) return;
exemplu3a(x-1);
cout << x << " ";
}
int main() { exemplu3a(4); }
Rezolvare pas cu pas:
| Pas | Stivă (sus = top) | Output | Observație |
|---|---|---|---|
| 1 | [exemplu3a x=4] | - | x=4>0 adevărat → autoapel exemplu3a(3), punem exemplu3a x=4 în stivă |
| 2 | [exemplu3a x=3, exemplu3a x=4] | - | x=3>0 adevărat → autoapel exemplu3a(2), punem exemplu3a x=3 în stivă |
| 3 | [exemplu3a x=2, exemplu3a x=3, exemplu3a x=4] | - | x=2>0 adevărat → autoapel exemplu3a(1), punem exemplu3a x=2 în stivă |
| 4 | [exemplu3a x=1, exemplu3a x=2, exemplu3a x=3, exemplu3a x=4] | - | x=1>0 adevărat → autoapel exemplu3a(0), punem exemplu3a x=1 în stivă |
| 5 | [exemplu3a x=0, exemplu3a x=1, exemplu3a x=2, exemplu3a x=3, exemplu3a x=4] | - | x=0 fals → return, scoatem exemplu3a x=0, continuăm după autoapel x=1, cout 1 |
| 6 | [exemplu3a x=2, exemplu3a x=3, exemplu3a x=4] | 1 | continuăm după autoapel x=2, cout 2 |
| 7 | [exemplu3a x=3, exemplu3a x=4] | 1 2 | continuăm după autoapel x=3, cout 3 |
| 8 | [exemplu3a x=4] | 1 2 3 | continuăm după autoapel x=4, cout 4 |
| 9 | [] | 1 2 3 4 | execuția se termină |
Funcția 5: cout după autoapel (x*x)
void exemplu3b(int x) {
if(x<=0) return;
exemplu3b(x-1);
cout << x*x << " ";
}
int main() { exemplu3b(3); }
Rezolvare pas cu pas:
| Pas | Stivă (sus = top) | Output | Observație |
|---|---|---|---|
| 1 | [exemplu3b x=3] | - | x=3>0 adevărat → autoapel exemplu3b(2), punem exemplu3b x=3 în stivă |
| 2 | [exemplu3b x=2, exemplu3b x=3] | - | x=2>0 adevărat → autoapel exemplu3b(1), punem exemplu3b x=2 în stivă |
| 3 | [exemplu3b x=1, exemplu3b x=2, exemplu3b x=3] | - | x=1>0 adevărat → autoapel exemplu3b(0), punem exemplu3b x=1 în stivă |
| 4 | [exemplu3b x=0, exemplu3b x=1, exemplu3b x=2, exemplu3b x=3] | - | x=0 fals → return, continuăm după autoapel x=1, cout 1*1=1 |
| 5 | [exemplu3b x=2, exemplu3b x=3] | 1 | continuăm după autoapel x=2, cout 2*2=4 |
| 6 | [exemplu3b x=3] | 1 4 | continuăm după autoapel x=3, cout 3*3=9 |
| 7 | [] | 1 4 9 | execuția se termină |
Funcția 6: factorial
int factorial(int n) {
if(n==0) return 1;
return n * factorial(n-1);
}
int main() { cout << factorial(5); }
Rezolvare pas cu pas:
| Pas | Stivă (sus = top) | Output | Observație |
|---|---|---|---|
| 1 | [factorial(5)] | - | 5!=0 → return 5*factorial(4), punem factorial(5) în stivă |
| 2 | [factorial(4), factorial(5)] | - | 4!=0 → return 4*factorial(3), punem factorial(4) în stivă |
| 3 | [factorial(3), factorial(4), factorial(5)] | - | 3!=0 → return 3*factorial(2), punem factorial(3) în stivă |
| 4 | [factorial(2), factorial(3), factorial(4), factorial(5)] | - | 2!=0 → return 2*factorial(1), punem factorial(2) în stivă |
| 5 | [factorial(1), factorial(2), factorial(3), factorial(4), factorial(5)] | - | 1!=0 → return 1*factorial(0), punem factorial(1) în stivă |
| 6 | [factorial(0), factorial(1), factorial(2), factorial(3), factorial(4), factorial(5)] | - | 0==0 → return 1, începe calculul: 1*1=1 pentru factorial(1) |
| 7 | [factorial(2), factorial(3), factorial(4), factorial(5)] | - | factorial(2)=2*1=2 |
| 8 | [factorial(3), factorial(4), factorial(5)] | - | factorial(3)=3*2=6 |
| 9 | [factorial(4), factorial(5)] | - | factorial(4)=4*6=24 |
| 10 | [factorial(5)] | - | factorial(5)=5*24=120 |
| 11 | [] | 120 | execuția se termină |
Funcția 7: suma primelor n numere
int suma(int n) {
if(n==0) return 0;
return n + suma(n-1);
}
int main() { cout << suma(5); }
Rezolvare pas cu pas:
| Pas | Stivă | Output | Observație |
|---|---|---|---|
| 1 | [suma(5)] | - | 5!=0 → return 5+suma(4) |
| 2 | [suma(4), suma(5)] | - | 4+suma(3) |
| 3 | [suma(3), suma(4), suma(5)] | - | 3+suma(2) |
| 4 | [suma(2), suma(3), suma(4), suma(5)] | - | 2+suma(1) |
| 5 | [suma(1), suma(2), suma(3), suma(4), suma(5)] | - | 1+suma(0) |
| 6 | [suma(0), suma(1), suma(2), suma(3), suma(4), suma(5)] | - | 0 → return 0, începe calculul: suma(1)=1, suma(2)=3, suma(3)=6, suma(4)=10, suma(5)=15 |
| 7 | [] | 15 | execuția se termină |
Funcția 8: Fibonacci
int fibonacci(int n) {
if(n==0) return 0;
if(n==1) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main() { cout << fibonacci(6); }
Rezolvare pas cu pas (cu stivă și output):
| Pas | Stivă (sus=top) | Output | Observație |
|---|---|---|---|
| 1 | [fib(6)] | - | 6>1 → autoapel fib(5), punem fib(6) în stivă |
| 2 | [fib(5), fib(6)] | - | 5>1 → autoapel fib(4), punem fib(5) în stivă |
| 3 | [fib(4), fib(5), fib(6)] | - | 4>1 → autoapel fib(3), punem fib(4) în stivă |
| 4 | [fib(3), fib(4), fib(5), fib(6)] | - | 3>1 → autoapel fib(2), punem fib(3) în stivă |
| 5 | [fib(2), fib(3), fib(4), fib(5), fib(6)] | - | 2>1 → autoapel fib(1), punem fib(2) în stivă |
| 6 | [fib(1), fib(2), fib(3), fib(4), fib(5), fib(6)] | - | 1 → caz bază → return 1, scoatem fib(1) din stivă |
| 7 | [fib(2), fib(3), fib(4), fib(5), fib(6)] | - | continuăm după autoapel fib(1): fib(2) = 1 + fib(0), autoapel fib(0), punem fib(2) în stivă |
| 8 | [fib(0), fib(2), fib(3), fib(4), fib(5), fib(6)] | - | 0 → caz bază → return 0, scoatem fib(0), calcul fib(2)=1+0=1 |
| 9 | [fib(3), fib(4), fib(5), fib(6)] | - | continuăm după autoapel fib(2): fib(3)=fib(2)+fib(1)=1+1=2 |
| 10 | [fib(4), fib(5), fib(6)] | - | continuăm după autoapel fib(3): fib(4)=fib(3)+fib(2)=2+1=3 |
| 11 | [fib(5), fib(6)] | - | continuăm după autoapel fib(4): fib(5)=fib(4)+fib(3)=3+2=5 |
| 12 | [fib(6)] | - | continuăm după autoapel fib(5): fib(6)=fib(5)+fib(4)=5+3=8 |
| 13 | [] | 8 | execuția se termină, output final 8 |
Funcția 9: maxim dintr-un vector
int maxim(int v[], int n) {
if(n==1) return v[0];
int m = maxim(v, n-1);
if (v[n-1] > m)
return v[n-1];
else return m;
}
int main() {
int v[] = {3,7,2,9,4};
cout << maxim(v,5);
}
Rezolvare pas cu pas:
| Pas | Stivă | Output | Observație |
|---|---|---|---|
| 1 | [maxim(v,5)] | - | n=5>1 → apel maxim(v,4), punem maxim(v,5) în stivă |
| 2 | [maxim(v,4), maxim(v,5)] | - | n=4>1 → apel maxim(v,3), punem maxim(v,4) în stivă |
| 3 | [maxim(v,3), maxim(v,4), maxim(v,5)] | - | n=3>1 → apel maxim(v,2), punem maxim(v,3) în stivă |
| 4 | [maxim(v,2), maxim(v,3), maxim(v,4), maxim(v,5)] | - | n=2>1 → apel maxim(v,1), punem maxim(v,2) în stivă |
| 5 | [maxim(v,1), maxim(v,2), maxim(v,3), maxim(v,4), maxim(v,5)] | - | n=1 → return v[0]=3, începe calculul |
| 6 | [maxim(v,2), maxim(v,3), maxim(v,4), maxim(v,5)] | - | maxim(v,2)=max(7,3)=7 |
| 7 | [maxim(v,3), maxim(v,4), maxim(v,5)] | - | maxim(v,3)=max(2,7)=7 |
| 8 | [maxim(v,4), maxim(v,5)] | - | maxim(v,4)=max(9,7)=9 |
| 9 | [maxim(v,5)] | - | maxim(v,5)=max(4,9)=9 |
| 10 | [] | 9 | execuția se termină |
Funcții recursive – exerciții 10–14
Exercițiul 10: Afișarea cifrelor unui număr
void afisCifre(int n) {
if(n<10) {
cout << n << " ";
} else {
afisCifre(n/10);
cout << n%10 << " ";
}
}
int main() { afisCifre(1234); }
Rezolvare pas cu pas:
| Pas | Stivă | Output | Observație |
|---|---|---|---|
| 1 | [afisCifre x=1234] | - | x>9 → autoapel afisCifre(123), punem afisCifre x=1234 în stivă |
| 2 | [afisCifre x=123, afisCifre x=1234] | - | x>9 → autoapel afisCifre(12), punem afisCifre x=123 în stivă |
| 3 | [afisCifre x=12, afisCifre x=123, afisCifre x=1234] | - | x>9 → autoapel afisCifre(1), punem afisCifre x=12 în stivă |
| 4 | [afisCifre x=1, afisCifre x=12, afisCifre x=123, afisCifre x=1234] | - | x<10 → cout 1, scoatem afisCifre x=1 |
| 5 | [afisCifre x=12, afisCifre x=123, afisCifre x=1234] | 1 | continuăm: cout 2, scoatem afisCifre x=12 |
| 6 | [afisCifre x=123, afisCifre x=1234] | 1 3 | cout 3, scoatem afisCifre x=123 |
| 7 | [afisCifre x=1234] | 1 3 4 | cout 4, scoatem afisCifre x=1234 |
| 8 | [] | 1 2 3 4 | execuția se termină |
Funcția 11: Inversarea unui șir de caractere (char s[30])
void inversare(char s[], int i) {
if(i < 0) return;
cout << s[i];
inversare(s, i - 1);
}
int main() {
char s[30] = "ABC";
inversare(s, 2); // afișează CBA
}
Rezolvare pas cu pas (cu stivă și output):
| Pas | Stivă (sus=top) | Output | Observație |
|---|---|---|---|
| 1 | [inversare(s,2)] | - | i=2 ≥0 → cout< |
| 2 | [inversare(s,1), inversare(s,2)] | C | i=1 ≥0 → cout< |
| 3 | [inversare(s,0), inversare(s,1), inversare(s,2)] | CB | i=0 ≥0 → cout< |
| 4 | [inversare(s,-1), inversare(s,0), inversare(s,1), inversare(s,2)] | CBA | i=-1 <0 → return, se scot cadrele active din stivă și execuția se termină |
Exercițiul 12: Calcul putere a^n
int putere(int a, int n) {
if(n==0) return 1;
return a*putere(a,n-1);
}
int main() { cout << putere(2,3); }
Rezolvare pas cu pas:
| Pas | Stivă | Output | Observație |
|---|---|---|---|
| 1 | [putere(2,3)] | - | n!=0 → 2*putere(2,2), punem putere(2,3) în stivă |
| 2 | [putere(2,2), putere(2,3)] | - | 2*putere(2,1), punem putere(2,2) în stivă |
| 3 | [putere(2,1), putere(2,2), putere(2,3)] | - | 2*putere(2,0), punem putere(2,1) în stivă |
| 4 | [putere(2,0), putere(2,1), putere(2,2), putere(2,3)] | - | n=0 → return 1, începem calculul: putere(2,1)=2*1=2 |
| 5 | [putere(2,2), putere(2,3)] | - | putere(2,2)=2*2=4 |
| 6 | [putere(2,3)] | - | putere(2,3)=2*4=8 |
| 7 | [] | 8 | execuția se termină |
Exercițiul 13: Numără cifrele unui număr
int nrCifre(int n) {
if(n==0) return 0;
return 1+nrCifre(n/10);
}
int main() { cout << nrCifre(12345); }
Rezolvare pas cu pas:
| Pas | Stivă | Output | Observație |
|---|---|---|---|
| 1 | [nrCifre 12345] | - | n!=0 → 1+nrCifre(1234), punem nrCifre 12345 în stivă |
| 2 | [nrCifre 1234, nrCifre 12345] | - | 1+nrCifre(123), punem nrCifre 1234 în stivă |
| 3 | [nrCifre 123, nrCifre 1234, nrCifre 12345] | - | 1+nrCifre(12), punem nrCifre 123 în stivă |
| 4 | [nrCifre 12, nrCifre 123, nrCifre 1234, nrCifre 12345] | - | 1+nrCifre(1), punem nrCifre 12 în stivă |
| 5 | [nrCifre 1, nrCifre 12, nrCifre 123, nrCifre 1234, nrCifre 12345] | - | 1+nrCifre(0), punem nrCifre 1 în stivă |
| 6 | [] | 5 | calcul final: 1+1+1+1+1=5 |
Exercițiul 14: Oglinditul unui număr
int oglindit(int n, int rev=0) {
if(n==0) return rev;
return oglindit(n/10, rev*10+n%10);
}
int main() { cout << oglindit(1234); }
Rezolvare pas cu pas:
| Pas | Stivă | Output | Observație |
|---|---|---|---|
| 1 | [oglindit n=1234, rev=0] | - | n!=0 → autoapel oglindit(123,0*10+4=4), punem în stivă |
| 2 | [oglindit n=123, rev=4, oglindit n=1234, rev=0] | - | n!=0 → autoapel oglindit(12,4*10+3=43), punem în stivă |
| 3 | [oglindit n=12, rev=43, oglindit n=123, rev=4, oglindit n=1234, rev=0] | - | autoapel oglindit(1,432), punem în stivă |
| 4 | [oglindit n=1, rev=432, ...] | - | autoapel oglindit(0,4321), n=0 → return 4321 |
| 5 | [] | 4321 | execuția se termină |
Exemple rezolvate – funcții recursive
Exemplul 1: Calculul factorialului unui număr
#include <iostream>
using namespace std;
int factorial(int x) {
if (x == 0) return 1;
return x * factorial(x - 1);
}
int main() {
cout << factorial(5); // Output: 120
return 0;
}
Rezolvare pas cu pas:
| Pas | Apeluri pe stivă | Output | Observație |
|---|---|---|---|
| 1 | factorial(5) | - | 5!=0 → return 5*factorial(4) |
| 2 | factorial(4) | - | 4!=0 → return 4*factorial(3) |
| 3 | factorial(3) | - | 3!=0 → return 3*factorial(2) |
| 4 | factorial(2) | - | 2!=0 → return 2*factorial(1) |
| 5 | factorial(1) | - | 1!=0 → return 1*factorial(0) |
| 6 | factorial(0) | - | 0 → return 1 |
| 7 | - | 120 | Factorialul complet |
Exemplul 2: Afișarea cifrelor unui număr de la stânga la dreapta
#include <iostream>
using namespace std;
void afisCifreStanga(int n) {
if (n == 0) return;
afisCifreStanga(n / 10);
cout << n % 10 << " ";
}
int main() {
afisCifreStanga(1234); // Output: 1 2 3 4
return 0;
}
Rezolvare pas cu pas:
| Pas | Apeluri pe stivă | Output | Observație |
|---|---|---|---|
| 1 | afisCifreStanga(1234) | - | Autoapel cu 1234/10=123 |
| 2 | afisCifreStanga(123) | - | Autoapel cu 123/10=12 |
| 3 | afisCifreStanga(12) | - | Autoapel cu 12/10=1 |
| 4 | afisCifreStanga(1) | - | Autoapel cu 1/10=0 |
| 5 | afisCifreStanga(0) | - | Return, începe afișarea |
| 6 | - | 1 2 3 4 | Cifrele se afișează în ordine |
Exemplul 3: Calculul sumei primelor n numere naturale
#include <iostream>
using namespace std;
int sumaPrimeleN(int n) {
if (n == 0) return 0;
return n + sumaPrimeleN(n - 1);
}
int main() {
cout << sumaPrimeleN(5); // Output: 15
return 0;
}
Rezolvare pas cu pas:
| Pas | Apeluri pe stivă | Output | Observație |
|---|---|---|---|
| 1 | sumaPrimeleN(5) | - | 5 + sumaPrimeleN(4) |
| 2 | sumaPrimeleN(4) | - | 4 + sumaPrimeleN(3) |
| 3 | sumaPrimeleN(3) | - | 3 + sumaPrimeleN(2) |
| 4 | sumaPrimeleN(2) | - | 2 + sumaPrimeleN(1) |
| 5 | sumaPrimeleN(1) | - | 1 + sumaPrimeleN(0) |
| 6 | sumaPrimeleN(0) | - | Return 0 |
| 7 | - | 15 | Suma calculată complet |
Exerciții propuse
-
Funcția 1:Ce afiseaza programul C++ de mai jos?
void pozitie(long n, int idx) { if(n != 0) { if(n % 3 != 0) { cout << idx; } pozitie(n / 3, idx + 1); } } int main() { pozitie(121, 1); } -
Funcția 2: Ce afiseaza programul C++ de mai jos?
void afisCifre(long n) { cout << n % 10; if(n != 0) { afisCifre(n / 100); cout << n % 10; } } int main() { afisCifre(12345); } -
Funcția 3:Ce afiseaza programul C++ de mai jos?
void cifreSpeciale(int x) { if(x > 0) { if(x % 4 == 0) { cout << 'A'; cifreSpeciale(x - 1); } else { cifreSpeciale(x / 3); cout << 'B'; } } } int main() { cifreSpeciale(26); } -
Funcția 4: Ce afiseaza programul C++ de mai jos?
void incrementRec(int n, int x) { if(x > n) cout << 0; else if(x % 4 <= 1) incrementRec(n, x + 1); else { incrementRec(n, x + 3); cout << 1; } } int main() { incrementRec(15, 2); } -
Funcția 5: Ce afiseaza programul C++ de mai jos?
void simbolRec(int a, int b) { if(a <= b) { simbolRec(a + 1, b - 2); cout << '*'; } else { cout << b; } } int main() { simbolRec(3, 17); } -
Funcția 6: Ce afiseaza programul C++ de mai jos?
int divSucc(int a, int b) { if(a < 1) return -1; else if(a % b == 0) return 1 + divSucc(a / b, b); else return 0; } int main() { cout << divSucc(15, 2) << " " << divSucc(128, 2); } -
Funcția 7: Ce afiseaza programul C++ de mai jos?
void afisPare(long n) { if(n != 0) { if(n % 2 == 0) cout << n % 10; afisPare(n / 10); } } int main() { afisPare(12345); } -
Funcția 8: Ce afiseaza programul C++ de mai jos?
int countDigit(long n, int k) { if(n == 0) return 0; if(n % 10 == k) return 1 + countDigit(n / 10, k); else return countDigit(n / 10, k); } int main() { cout << countDigit(1213111, 1); } -
Funcția 9: Ce afiseaza programul C++ de mai jos?
int sumIndex(int n, int y) { if(n == 0) return 0; y = y + 1; return y + sumIndex(n - 1, y); } int main() { cout << sumIndex(3, 1); } -
Funcția 10: Ce afiseaza programul C++ de mai jos?
int minDigit(int n) { if(n == 0) return 9; int c = minDigit(n / 10); if(n % 10 < c) return n % 10; else return c; } int main() { cout << minDigit(23159); } -
Funcția 11: Ce afiseaza programul C++ de mai jos?
long g(long x) { if(x > 9) return (x/10 + x%10); else return x; } long f(int c) { if(c < 1) return 1; else return g(c + f(c - 1)); } int main() { cout << f(6) << " " << g(11); } -
Funcția 12: Ce afiseaza programul C++ de mai jos?
int F(int n) { if(n==0 || n==1) return 1; return 2*F(n-1) + 2*F(n-2); } int main() { cout << F(3); } -
Funcția 13: Ce afiseaza programul C++ de mai jos?
void divSelect(long n) { if(n > 9) { cout << n/100; divSelect(n/10); } } int main() { divSelect(12345); } -
Funcția 14: Ce afiseaza programul C++ de mai jos?
void cifreRec(long n, int i) { if(i < n%10) { cout << n%10; cifreRec(n/10, i+1); } } int main() { cifreRec(12345, 0); } -
Funcția 15: Ce afiseaza programul C++ de mai jos?
int F2(int x) { if(x <= 1) return x; return x + F2(x-2); } int main() { cout << F2(18); } - Scrieți o funcție recursivă factorial care primește prin parametrul x un număr natural și returnează factorialul acestuia. Exemplu: Pentru x=5, factorial(5)=120.
- Scrieți o funcție recursivă afisCifreStanga care primește un număr natural n și afișează toate cifrele sale de la stânga la dreapta. Exemplu: Pentru n=1234, afișează: 1 2 3 4
- Scrieți o funcție recursivă afisCifreDreapta care primește un număr natural n și afișează toate cifrele sale de la dreapta la stânga. Exemplu: Pentru n=1234, afișează: 4 3 2 1
- Scrieți o funcție recursivă sumaPrimeleN care primește un număr natural n și returnează suma primelor n numere naturale. Exemplu: Pentru n=5, sumaPrimeleN(5)=15
- Scrieți o funcție recursivă palindrom care primește un șir de caractere s și returnează true dacă șirul este palindrom, false altfel. Exemplu: Pentru s="radar", palindrom("radar")=true
- Scrieți o funcție recursivă maxVector care primește un vector de numere și returnează elementul maxim. Exemplu: Pentru v={3,7,2,9,4}, maxVector(v,5)=9
- Scrieți o funcție recursivă cmmc care primește două numere naturale și returnează cel mai mare divizor comun (CMMDC). Exemplu: Pentru a=12 și b=18, cmmc(12,18)=6
- Scrieți o funcție recursivă afisVector care primește un vector și afișează elementele acestuia. Exemplu: Pentru v={1,2,3}, afișează: 1 2 3
- Scrieți o funcție recursivă convertBaza2 care primește un număr natural și afișează reprezentarea sa în baza 2. Exemplu: Pentru n=13, afișează: 1101