Șirul lui Fibonacci
Definiție recurentă:
Primii termeni: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...
Iterativ sau recursiv
| Iterativ | Recursiv naiv | |
|---|---|---|
| Complexitate | ||
| Memorie | pe stivă | |
| F(40) | instantaneu | secunde bune |
| F(50) | instantaneu | practic imposibil |
Recursivitatea naivă recalculează aceiași termeni de nenumărate ori. Pentru se fac 15 apeluri; pentru , peste 300 de milioane.
La BAC, dacă se cere doar valoarea, folosește varianta iterativă. Recursivitatea se cere când subiectul o indică explicit sau când trebuie urmărit arborele de apeluri.
Atenție la depășire
depășește deja int pe 32 de biți. Peste , folosește long long (C/C++), int64 (Pascal). În Python nu e problemă, întregii cresc oricât.
Sume cu termen general dat
Tiparul e mereu același:
- inițializezi acumulatorul cu 0 pentru sumă, cu 1 pentru produs;
- parcurgi cu un contor;
- adaugi (sau înmulțești) termenul general.
Exemple:
- , cu verificare: ;
- , cu verificare: ;
- (suma armonică), care cere tip real.
Greșeli frecvente
- Se pornește șirul cu când problema cere . Citește cu atenție indexarea din enunț.
- Se folosește recursivitatea naivă pentru mare și programul depășește timpul.
- Se uită depășirea la .
Alege limbajul în care dai examenul. Poți edita codul și îl poți rula direct aici. Programa oficiala de BAC (proba E.d) cere Pascal sau C/C++, la alegere. Python apare in manualele noi si e pus aici pentru inteles, nu ca limbaj de examen.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long a = 0, b = 1;
for (int i = 0; i < n; i++) {
long long c = a + b;
a = b;
b = c;
}
cout << "F(" << n << ")=" << a << " ";
long long s = 0, p = 1;
for (int i = 1; i <= 5; i++) {
s += i;
p *= i;
}
cout << "suma1..5=" << s << " produs1..5=" << p;
return 0;
}