[canonical]: https://grile.online/informatica/subprograme

> Pagina completă: https://grile.online/informatica/subprograme
> 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 Subprograme · Informatică

6 grile, în 3 seturi, cu explicații.

## Teaser gratuit, fără cont

1. Subprogramul $f$ este definit alăturat. Indicați valoarea $f(2,5)$.

a) $3$
b) $0$
c) $-2$
d) $-5$

Răspuns corect: d) $-5$

Subprogramul coboară recursiv cât timp `n>0`, întorcând `x` direct la ieșirea din recursivitate:
```cpp
f(2,5) -> f(f(0,5)-2, 0) = f(3,0)
f(3,0) -> f(f(1,0)-2, -5) = f(-7,-5)
f(-7,-5) -> x = -5 (n <= 0)
```
Deci $f(2,5) = -5$.

2. Subprogramul $f$ este definit alăturat. Indicați ce se afișează în urma apelului de mai jos: $f(3)$.

a) $1211213$
b) $123121$
c) $123$
d) $01201012013$

Răspuns corect: a) $1211213$

Bucla din `f` apelează recursiv `f(i-1)` pentru fiecare `i`, afișând `i` înainte de apelul recursiv când e impar și după, când e par:
```cpp
i=1 (impar): f(0) -> "", apoi cout<<1  => "1"
i=2 (par):   cout<<2, apoi f(1) -> "1" => "21"
i=3 (impar): f(2) -> "121", apoi cout<<3 => "1213"
```
Concatenând cele trei etape rezultă $1211213$.

3. Subprogramul $f$ este definit alăturat. Indicați ce se afișează în urma apelului de mai jos: $f(2020,0)$.

a) $23020$
b) $2022100$
c) $02023210$
d) $23022100$

Răspuns corect: d) $23022100$

$f$ coboară recursiv `x/10` până `x<10`, apoi revine afișând, la fiecare nivel, `x%10` urmat de `y`:
```cpp
f(2020,0) -> f(202,1) -> f(20,2) -> f(2,3)
f(2,3):  x<10, deci cout<<2, cout<<3         => "23"
f(20,2): cout<<20%10=0, cout<<2              => "2302"
f(202,1):cout<<202%10=2, cout<<1             => "230221"
f(2020,0):cout<<2020%10=0, cout<<0           => "23022100"
```
Rezultatul final este $23022100$.

4. Subprogramul $f$ este definit alăturat. Indicați ce se afișează în urma apelului de mai jos: $f(9)$.

a) $225554$
b) $545522$
c) $55109$
d) $92255$

Răspuns corect: b) $545522$

Subprogramul multiplică `x` cu `5/2` cât timp `x%5!=0`, altfel scade `1`, apoi afișează `x` la fiecare nivel, la revenire din recursivitate:
```cpp
f(9):  x=9*5/2=22  -> f(22)
f(22): x=22*5/2=55 -> f(55)
f(55): x%5==0, x=55-1=54, cout<<54
f(22): cout<<55
f(9):  cout<<22
```
Rezultatul afișat este $545522$.

5. Funcția $f$ este definită alăturat. Indicați rezultatul apelului $f(2025)$.

a) $-19$
b) $10$
c) $-13$
d) $3$
e) $-18$
f) $-12$

Răspuns corect: a) $-19$

Pentru $n$ impar, $f$ coboară spre `n/2` scăzând $2$; pentru $n$ par nenul, urcă spre `n+1` adunând $1$, până ajunge la $n=0$:
```cpp
f(1)=-2, f(3)=-4, f(7)=-6, f(15)=-8, f(31)=-10, f(63)=-12, f(127)=-14
f(126)=f(127)+1=-13, f(253)=-15, f(507)=-17, f(506)=f(507)+1=-16
f(1013)=-18, f(1012)=f(1013)+1=-17, f(2025)=f(1012)-2=-19
```
Deci $f(2025) = -19$.

## Seturi care conțin acest capitol

- [Informatică #001](https://grile.online/informatica/rezolva?set=informatica-bac-1)
- [Informatică #002](https://grile.online/informatica/rezolva?set=informatica-bac-2)
- [Informatică #003](https://grile.online/informatica/rezolva?set=informatica-poli-2025)
