Pe scurt
În convenția , , fiecare termen ulterior este suma celor doi anteriori: pentru . Primii termeni sunt 0, 1, 1, 2, 3, 5. O problemă poate folosi altă numerotare; citește valorile inițiale din enunț înainte de a calcula.
În detaliu
Șirul lui Fibonacci este definit prin recurență de ordinul doi: un termen se obține din ceilalți doi dinaintea lui. Manualele de liceu îl scriu adesea și pentru , iar matematica îl începe cu , . Cele două scrieri dau aceleași valori, 1, 1, 2, 3, 5, 8, 13, 21, ..., numai că pentru : indicele este singura diferență. De aceea, la fiecare problemă citești întâi ce valori are enunțul pentru primii doi termeni.
Nu este nevoie de un vector. Ca să calculezi termenul următor îți trebuie doar ultimii doi, deci ții în memorie două variabile, și , cu și . La fiecare pas se calculează suma, apoi cele două variabile „alunecă” cu o poziție: primește vechea valoare a lui , iar primește suma. Timpul este proporțional cu , iar memoria auxiliară este constantă.
Exemplul 1 — termenul de rang . Se citește și se afișează .
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long a = 0, b = 1; // a = F(i), b = F(i+1), pentru i = 0
for (int i = 0; i < n; ++i) {
long long urmator = a + b;
a = b;
b = urmator;
}
cout << a;
return 0;
}
Pentru perechea se schimbă astfel: . După cinci pași , deci se afișează . Pentru bucla nu se execută și se afișează 0, iar pentru se afișează 1. Pentru se afișează 55, iar pentru se afișează 6765.
Același ciclu răspunde și la întrebări de numărare. Printre , adică 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, sunt cinci termeni pari; îi numeri testând a % 2 == 0 la fiecare pas, înainte de actualizarea perechii.
Exemplul 2 — primul termen care depășește o limită. Se cere primul termen din șirul care este cel puțin 100 și poziția lui.
- Pornești cu , , , unde este al -lea termen.
- Cât timp , calculezi , muți , și crești .
- La ieșire din ciclu, este primul termen cerut, pe poziția .
int a = 1, b = 1, c, k = 2;
while (b < 100) {
c = a + b;
a = b;
b = c;
k++;
}
cout << k << ' ' << b;
Secvența, rulată într-un program complet, afișează 12 144: termenul al 11-lea, 89, este încă mai mic decât 100, iar al 12-lea, 144, îl depășește.
Exemplul 3 — suma primilor termeni. Se cere , cu . Un ciclu adaugă la fiecare pas termenul curent:
long long a = 1, b = 1, s = 0;
for (int i = 1; i <= n; ++i) {
s += a;
long long urmator = a + b;
a = b;
b = urmator;
}
cout << s;
Pentru termenii adăugați sunt 1, 1, 2, 3, 5, 8, iar sumele parțiale sunt 1, 2, 4, 7, 12, 20; se afișează 20. Se observă că , unde . Relația este adevărată pentru orice și permite verificarea rezultatului: sumele parțiale 1, 2, 4, 7, 12 sunt cu 1 mai mici decât 2, 3, 5, 8, 13, adică termenii . Greșeala tipică este să pornești suma cu sau să aduni termenul după ce perechea a alunecat; în ambele cazuri se obține un rezultat decalat.
Limitele tipului. Termenii cresc repede. Cel mai mare termen care încape în long long este , iar depășește și încape numai în unsigned long long. Dacă enunțul impune limite pentru , alegi tipul după ele.
Pentru admitere
La un fragment cu recurență urmărești simultan ambele variabile și ordinea actualizărilor. Pașii unei secvențe de forma „; ” nu produc șirul lui Fibonacci: după prima atribuire și sunt egale, iar suma devine dublul lui . Pornind de la , , valorile sunt , apoi , apoi : se dublează. Corect este să salvezi suma într-o a treia variabilă sau să calculezi înainte de .
Verifică și cazurile mici: dacă ciclul face pași, la răspunsul este valoarea inițială a lui , iar la obții .
Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
int a = 0, b = 1;
for (int i = 0; i < 4; ++i) {
a = b;
b = a + b;
cout << a << ' ' << b << '\n';
}
Variante:
- a)
1 1,1 2,2 3,3 5 - b)
1 2,2 4,4 8,8 16 - c)
1 2,2 3,3 5,5 8 - d)
1 1,1 1,1 1,1 1
Răspunsul corect este b). În prima iterație primește 1, iar . În a doua, și . Fiecare iterație dublează perechea, deci ultima linie este 8 16. Varianta a) ar fi corectă numai dacă suma s-ar calcula înainte de atribuirea lui .
Al doilea exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
int a = 1, b = 2, s = 0;
for (int i = 0; i < 5; ++i) {
s = s + a;
int c = a + b;
a = b;
b = c;
}
cout << s;
- a)
19 - b)
32 - c)
12 - d)
8
Răspunsul corect este a). Ciclul se execută de cinci ori, iar la fiecare iterație a ia pe rând valorile 1, 2, 3, 5, 8, care se adaugă la s. Suma este . Varianta b) rezultă dacă se fac șase iterații, nu cinci, iar varianta d) este ultima valoare a lui a în ciclu, nu suma.
Greșeli frecvente
- Greșit: orice șir Fibonacci începe obligatoriu cu 1, 1 indiferent de enunț.Corect: verifică termenii inițiali și indexarea.
- Greșit: în convenția .Corect: .
- Greșit: actualizările pot fi făcute fără a păstra valoarea veche necesară.Corect: folosește un temporar.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3 și 6; aplicabilitatea 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 5–6; edu.ro
Documente consultate
- Programa școlară de informatică, clasa a IX-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42), p. 1653–1654; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3 și 6; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original)
