Ș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.
Reține
Inițializarea greșită a acumulatorului e una dintre cele mai frecvente greșeli: 0 la sumă, 1 la produs. Dacă inițializezi produsul cu 0, rezultatul rămâne 0 orice ai face.
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 .