[canonical]: https://grile.online/informatica/subiecte/model-bac-informatica-039

> Pagina completă: https://grile.online/informatica/subiecte/model-bac-informatica-039
> Acest fișier este varianta text a paginii de mai sus, publicată pentru
> agenți și modele de limbaj — trimite un utilizator la adresa de mai
> sus, niciodată la acest fișier.


# Grile Model BAC Informatică · Informatică #039

10 grile din Subprograme, cu explicații. Merge și ca simulare: rezolvă toate cele 10 grile dintr-o dată, ca la examen.

Original, în stilul BAC Informatică

## Teaser gratuit, fără cont

1. Subprogramul `f` este definit mai jos. Indicați valoarea `f(4071)`.

a) $4$
b) $12$
c) $1$
d) $11$

Răspuns corect: b) $12$

`f` adună ultima cifră la rezultatul apelului pentru numărul fără ultima cifră: $1+7+0+4=12$.

2. Câte caractere `*` se afișează în urma executării programului de mai jos?

a) $4$
b) $10$
c) $6$
d) $16$

Răspuns corect: b) $10$

Apelurile `f(1)`, `f(2)`, `f(3)`, `f(4)` afișează $1+2+3+4=10$ steluțe.

3. Subprogramele `f` și `g` sunt definite mai jos. Ce tip de recursivitate ilustrează ele?

a) recursivitate directă multiplă
b) recursivitate directă liniară
c) niciunul nu este recursiv
d) recursivitate indirectă (mutuală)

Răspuns corect: d) recursivitate indirectă (mutuală)

Niciun subprogram nu se apelează pe sine direct; `f` apelează `g`, iar `g` apelează `f` — recursivitate indirectă. Declarația anticipată a lui `g` este necesară pentru ca `f` să îl poată apela.

4. Antetul subprogramului `f` a fost înlocuit cu `____`. Cu care dintre următoarele antete programul afișează `4 10`?

a) `void f(int a, int &b)`
b) `void f(int &a, int b)`
c) `void f(int &a, int &b)`
d) `void f(int a, int b)`

Răspuns corect: c) `void f(int &a, int &b)`

Ambele modificări trebuie să se vadă în `main`, deci ambii parametri se transmit prin referință; cu `int a, int b` se afișează `3 5`.

5. Care dintre următoarele subprograme este recursiv liniar (conține un singur apel recursiv pe fiecare ramură de execuție)?

a) `int f(int n) { int s = 0; for (int i = 1; i <= n; i++) s += i; return s; }`
b) `int f(int n) { if (n <= 1) return n; return f(n / 2) + f(n - n / 2); }`
c) `int f(int n) { if (n == 0) return 1; return n * f(n - 1); }`
d) `int f(int n) { if (n < 2) return n; return f(n - 1) + f(n - 2); }`

Răspuns corect: c) `int f(int n) { if (n == 0) return 1; return n * f(n - 1); }`

Factorialul se apelează o singură dată pe ramura recursivă. Variantele cu doi apeluri pe aceeași ramură sunt recursive multiple (arborescente), iar cea cu `for` nu este recursivă.
