f(2023), cu f(n/10)*10+3 dacă ultima cifră e 2, altfel f(n/10)*10+2Doar la matematică-informatică. Ce este un autoapel, cum scrii pe foaie apelurile și cum urci înapoi cu rezultatele. Opt itemi oficiali urmăriți pas cu pas, cu punctele din barem și tiparele care se repetă.

ții minte doar fișa asta și ești acoperit
Doar la matematică-informatică. La științele naturii recursivitatea nu e în programă.
Apare în toate cele 23 de lucrări MI din 2023-2027: un item, 21 de ori la Subiectul I (4 p) și de 2 ori la II.2 (6 p).
Metoda: cobori scriind apelurile, până la condiția de oprire. Apoi urci și înlocuiești.
Truc: În jos scrii, în sus calculezi.
II.2 cu două apeluri cerute = 6 p: câte 3 p pentru fiecare valoare.
Împărțirea e întreagă: n/10 taie ultima cifră, iar n%10 o dă.
Recunoaște tiparul: n%k și n/k pe cifre; două autoapeluri pe jumătăți de tablou.
Culorile din lecție:termencifră, datăidee-cheie
Ești la coadă și vrei să știi al câtelea ești. Nu numeri. Îl întrebi pe cel din față, iar el îl întreabă pe cel din fața lui. Primul din coadă nu mai are pe cine să întrebe și spune „1”. Răspunsul se întoarce din om în om, cu 1 în plus de fiecare dată.
Oficial: omul care nu mai întreabă pe nimeni este condiția de oprire. Întrebarea către cel din față este autoapelul. Oamenii care așteaptă răspunsul sunt apelurile neterminate, ținute pe stivă.
int fact(int n)
{ if(n==0) return 1;
return n*fact(n-1);
}
Apelul fact(3) merge așa:
fact(3): dus și întors
fact(3) așteaptă fact(2)
va calcula 3 înmulțit cu ce primește
fact(2) așteaptă fact(1)
va calcula 2 înmulțit cu ce primește
fact(1) așteaptă fact(0)
va calcula 1 înmulțit cu ce primește
fact(0) = 1
condiția de oprire
Întors: fact(1)=1, fact(2)=2, fact(3)=6
Fiecare apel are propriile copii ale parametrilor transmiși prin valoare. n din fact(3) nu se schimbă când fact(2) lucrează cu al lui n.
În Pascal, valoarea se atribuie numelui funcției, nu se folosește return: if n=0 then fact:=1 else fact:=n*fact(n-1). Mecanismul este același.
Se cere f(1,10).
int f(int n,int m)
{ if(n>=m) return 0;
else return 1+f(n+1,m-2);
}
ApelReturnează
f(1,10)f(2,8)f(3,6)f(4,4)| Apel | Returnează |
|---|---|
f(1,10) | 1+2 = 3 |
f(2,8) | 1+1 = 2 |
f(3,6) | 1+0 = 1 |
f(4,4) | 0, pentru că 4>=4 |
Barem: varianta b, adică 3, 4 p. Greșeala tipică este să numeri și ultimul apel: sunt patru apeluri, dar doar trei adunări de 1.
Se cere f(56579).
int f(int n)
{ if(n==0) return 0;
if(n%2==1) return f(n/10)+1;
return f(n/10)-1;
}
n%2 se uită la paritatea numărului, deci la ultima cifră. Funcția parcurge cifrele: +1 pentru impar, -1 pentru par. Cifrele 5, 6, 5, 7, 9 dau 1-1+1+1+1 = 3. Barem: varianta d, 4 p.
Aici nu ai nevoie de toate apelurile scrise. După ce ai văzut ce face funcția, numeri. Dacă ai timp, verifică pe un număr mai scurt.
August 2025, varianta 4. Se cer f(3,9) și f(1,1000).
int f(int x,int y)
{ if(x*5>y/5) return x;
return f(x*5,y/5);
}
f(3,9): 15 > 1, deci rezultatul e 3.f(1,1000): 5 > 200 e fals, trece la f(5,200). 25 > 40 e fals, trece la f(25,40). 125 > 8 e adevărat, deci rezultatul e 25.Barem: câte 3 p pentru fiecare valoare. Aici nu există nimic de calculat la întoarcere: rezultatul ultimului apel urcă neschimbat.
Rezervă iunie 2025, varianta 7. Se cer f(2) și f(17).
int f(int x)
{ if(x<=4) return x;
else return x-f(x-2);
}
f(2) = 2, din condiția de oprire.f(17) cobori din 2 în 2 până la f(3)=3. Urci: f(5)=5-3=2, f(7)=7-2=5, f(9)=9-5=4, f(11)=11-4=7, f(13)=13-7=6, f(15)=15-6=9, f(17)=17-9=8.Barem: câte 3 p pentru fiecare soluție. Scrie-le ca în barem: f(2)=2, f(17)=8.
Unele funcții fac ceva cunoscut. Dacă vezi tiparul, ai și o verificare a rezultatului.
f(2023), cu f(n/10)*10+3 dacă ultima cifră e 2, altfel f(n/10)*10+2f(35,3), cu n%k+10*f(n/k,k)f(3,2), cu z=f(x,y/2), apoi z*z sau z*z*xf(0,4,x), cu două apeluri, pe jumătăți de tablouv[d]==2*d| Lucrare | Se cere | Ce face | Răspuns |
|---|---|---|---|
| Simulare 2023, I.2 | f(2023), cu f(n/10)*10+3 dacă ultima cifră e 2, altfel f(n/10)*10+2 | înlocuiește cifrele, păstrând ordinea | 3232 (b) |
| Specială 2023, var. 6, I.2 | f(35,3), cu n%k+10*f(n/k,k) | scrie n în baza k | 1022 (a) |
| August 2023, var. 7, I.2 | f(3,2), cu z=f(x,y/2), apoi z*z sau z*z*x | ridicare la putere | 9 (c) |
| Model 2026, I.2 | f(0,4,x), cu două apeluri, pe jumătăți de tablou | numără pozițiile cu v[d]==2*d | 2 (b) |
La modelul 2026, tabloul este (2,0,2,6,8). Doar pozițiile 3 și 4 au v[d] egal cu 2*d: 6 și 8.
Ce face f dacă returnează n%k+10*f(n/k,k)?
Simulare 2025, I.2. Care apel dă 2025?
int f(int x)
{ if(x>500) return 5;
else return 5*f(x*10+5)+x;
}
Încearcă f(0): cobori prin 0, 5, 55, 555. f(555)=5, f(55)=25+55=80, f(5)=400+5=405, f(0)=2025+0=2025. Barem: varianta d. Pentru grile de felul acesta, începe cu varianta care pare cea mai simplă.
Model 2025, I.2. Se cere f(2,5). Autoapelul este în parametrul altui autoapel.
int f(int n,int x)
{ if(n>0)
return f(f(n-2,x)-2,x-5);
return x;
}
Calculezi întâi apelul din interior.
f(0,5)f(2,5)f(5-2,0), adică f(3,0)f(-1,0)f(1,0)f(0-2,-5), adică f(-2,-5) = -5f(3,0)f(-5-2,-5), adică f(-7,-5) = -5| Apel | Calcul | Rezultat |
|---|---|---|
f(0,5) | n nu e pozitiv | 5 |
f(2,5) | devine f(5-2,0), adică f(3,0) | ? |
f(-1,0) | n nu e pozitiv | 0 |
f(1,0) | devine f(0-2,-5), adică f(-2,-5) = -5 | -5 |
f(3,0) | devine f(-5-2,-5), adică f(-7,-5) = -5 | -5 |
Deci f(2,5) = -5. Barem: varianta d.
Model 2027, I.3. Se cere f(97,0).
int f(int n,int k)
{ if(n==0) return 0;
else if(k*k<=n)
return k+f(n/2,k+1);
else return k+f(n/2,n);
}
Perechile (n,k) sunt (97,0), (48,1), (24,2), (12,3), (6,4), (3,6), (1,3), (0,1). Atenție la (6,4): 16 > 6, deci al doilea parametru devine n, adică 6. Se adună valorile lui k până la oprire: 0+1+2+3+4+6+3 = 19. Barem: varianta C.
În lucrările 2023-2027 nu am găsit niciun item care să ceară explicit un subprogram recursiv, iar la III.1 baremul punctează „orice modalitate de rezolvare corectă”. Programa cere totuși să le știi, și e bine să poți scrie măcar formele scurte:
int sc(int n)
{ if(n==0) return 0;
return n%10+sc(n/10);
}
int fib(int n)
{ if(n<=2) return 1;
return fib(n-1)+fib(n-2);
}
int cmmdc(int a,int b)
{ if(b==0) return a;
return cmmdc(b,a%b);
}
sc(528) e 15, fib(6) e 8, cmmdc(84,36) e 12. Ordinea de scriere e mereu aceeași: întâi oprirea, apoi autoapelul cu date mai mici.
Ce valoare are f(2) dacă if(x<=4) return x;?
Ce se întâmplă dacă lipsește condiția de oprire?
| Tip de item | Unde a apărut | Ce faci |
|---|---|---|
| Valoarea unui apel | specială 2026 I.2, rezervă 2026 I.2, simulare 2023 I.2, model 2027 I.3 | tabel cu apelurile |
| Două valori, la II.2 | august 2025, rezervă 2025 | câte un tabel; 3 p fiecare |
| Care apel dă rezultatul | simulare 2025 I.2 | încerci variantele |
| Aceeași valoare la mai multe funcții | model 2024 I.2 | calculezi pentru n=24: toate dau 300 |
| Apel în apel | model 2025 I.2 | întâi cel din interior |
| Afișare pe drum, apel de completat | vezi lecția următoare | urmărești ordinea |
9/5 este 1, iar 1000/5/5 este 40.x-f(x-2) nu se distribuie din ochi, calculează pas cu pas.