De ce contează?
Urci o scară de cinci trepte ca să duci găleți de apă într-un butoi. Faci mereu același gest: pui piciorul pe treapta următoare, golești găleata în butoi, apoi verifici dacă mai ai trepte. Nu inventezi o mișcare nouă pentru fiecare treaptă — repeți aceeași mișcare, iar butoiul se umple puțin câte puțin. Exact asta face o structură repetitivă: o singură instrucțiune, repetată, care adună un rezultat.
Intuiția
O structură repetitivă (o buclă) execută același corp de instrucțiuni de mai multe ori. Are trei piese: o variabilă de control care numără la ce pas ești, o condiție care spune cât timp continui și un corp care face treaba la fiecare pas. Adesea ții pe lângă ele un acumulator — o variabilă în care strângi, treaptă cu treaptă, rezultatul final.
Vezi cum funcționează
Vrem să calculăm suma 1 + 2 + 3 + 4 + 5. Urmărește cum se construiește șirul
termen cu termen: la fiecare pas apare un număr nou și se adaugă la ce aveai deja.
Folosește ← și → ca să pășești termen cu termen, sau Redă pentru animație. Observă cum suma crește exact cu termenul nou la fiecare pas.
Ca să afli suma primelor 5 numere, scrii pur și simplu pe hârtie:
1 + 2 + 3 + 4 + 5 și aduni: rezultatul e 15. Simplu și corect.
Dar dacă ți se cere suma primelor 1000000 de numere? Nu poți scrie de mână un milion de termeni — ai nevoie de luni și ai greși pe drum. Codul de adunare „desfășurat" devine imposibil de scris.
Observă tiparul: la fiecare pas faci exact același lucru — iei numărul curent și îl adaugi într-un acumulator. Diferă doar numărul. Deci nu am nevoie de un milion de instrucțiuni, ci de UNA singură, repetată de un milion de ori.
Folosești o buclă for: o variabilă i merge de la 1 la n, iar la fiecare pas
faci suma = suma + i. La final, suma conține totul. Pentru n = 5 dă 15;
pentru n = 1000000 dă răspunsul în câteva microsecunde.
Algoritmul pas cu pas
Pornim cu acumulatorul suma = 0 și plimbăm i de la 1 la n = 5. La fiecare
pas adăugăm i în suma. Urmărim cele două valori după fiecare iterație:
Înainte de buclă: suma = 0.
Iterația i = 1: suma = 0 + 1 = 1.
1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | 3 | 4 |
i=1 |
Iterația i = 2: suma = 1 + 2 = 3.
1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | 3 | 4 |
i=2 |
Iterația i = 3: suma = 3 + 3 = 6.
1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | 3 | 4 |
i=3 |
Iterația i = 4: suma = 6 + 4 = 10.
1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | 3 | 4 |
i=4 |
Iterația i = 5: suma = 10 + 5 = 15.
1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | 3 | 4 |
i=5 |
Acumulatorul trebuie inițializat înainte de buclă: suma = 0 pentru sume
(elementul neutru la adunare), respectiv produs = 1 dacă ai înmulți. Dacă uiți
inițializarea, pornești de la o valoare de gunoi și tot rezultatul e greșit.
Implementare C++
#include <iostream>
using namespace std;
int main() {
int n = 5;
int suma = 0; // acumulatorul: porneste de la 0
for (int i = 1; i <= n; i++) { // i de la 1 la n inclusiv
suma = suma + i; // adaug termenul curent
}
cout << suma; // 15
return 0;
}Bucla for strânge toate cele trei piese pe un singur rând: inițializarea
(int i = 1), condiția (i <= n) și pasul (i++). Aceeași logică se scrie și cu
while, când nu știi din start de câte ori repeți:
int i = 1, suma = 0;
while (i <= n) { // cat timp conditia e adevarata
suma = suma + i;
i++; // NU uita sa avansezi, altfel bucla infinita
}
// suma == 15Varianta do-while execută corpul măcar o dată și abia apoi verifică
condiția — utilă când vrei garantat cel puțin o repetare (de exemplu, citirea unei
valori până e validă).
Complexitate
| Caz | Timp | Spațiu |
|---|---|---|
| Orice | O(n) | O(1) |
Faci o iterație per termen, deci n pași — timp O(n). Folosești doar câteva
variabile (i, suma), indiferent cât e n, deci spațiu O(1).
Capcana 1 — off-by-one. Dacă scrii for (int i = 1; i < n; i++) cu n = 5,
i ajunge doar la 4 și obții 1+2+3+4 = 10, nu 15. Pentru a include n, condiția
trebuie să fie i <= n. Întreabă-te mereu: ultima valoare a lui i chiar intră în
buclă?
Capcana 2 — bucla infinită. La while, dacă uiți i++, condiția i <= n
rămâne mereu adevărată și programul nu se mai oprește. Orice while trebuie să
schimbe, în corp, ceva ce apropie condiția de fals.