Documente Academic
Documente Profesional
Documente Cultură
Sirul lui Fibonacci este o secventa de numere in care fiecare numar se obtine din
suma precedentelor doua din sir. Astfel, primele 10 numere ale sirului lui Fibonacci sunt:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
(primele 2 numere sunt predefinite, iar restul se obtin in mod recursiv, din suma
precedentelor doua: 3 = 2 + 1, 5 = 3 + 2, samd...)
Secventa numerelor lui Fibonacci a fascinat de-a lungul istoriei pe foarte multi oameni de
stiinta, matematicieni, fizicieni, biologi, si, continua sa o faca chiar si in prezent.
Problema iepurilor
Fiind dată o pereche de iepuri, se ştie că fiecare pereche de iepuri produce în fiecare
lună o nouă pereche de iepuri, care la rândul său devine productivă la vârsta de o lună. Să
se determine câte perechi de iepuri vor fi după n luni.
1
Cum fn≠0, ultima egalitate devine:
(4) λ2 -λ-1=0
adică o ecuaţie pătratică în raport cu parametrul real λ, cu soluţiile:
Şirurile de forma
verifică egalitatea (1). De aici deducem că ecuaţia de forma (1) posedă mai multe soluţii
(o infinitate). Se verifică uşor că toate şirurile de forma:
cu soluţia :
2. Probleme rezolvate
2
2. Scara 2. Georgel vrea să ştie în câte moduri diferite poate să urce o scară cu n trepte,
dacă poate urca una sau k trepte odată, unde k este dat. De exemplu, când k=3, Georgel
urcă una sau trei trepte odată.
Soluţie: Pentru a ajunge la nivelul n, se poate urca de la nivelul n-1 sau n-k. În acest caz
relaţia de recurenţă este F[n]=F[n-1]+F[n-k]. Rămâne să stabilim care sunt valorile
iniţiale. Astfel, avem că F[1]=1, F[2]=1,…,F[k-1]=1 şi F[k]=2. Rezultă că
F[k+1]=F[k]+F[1]=3,ş.a.m.d.
3. Scara 3. Georgel vrea să ştie în câte moduri diferite poate să urce o scară cu n trepte,
dacă poate urca una sau k trepte odată, unde k este dat. Din cauza efortului depus, după
ce a urcat k trepte poate să urce numai una, după care poate continua cu 1 sau k trepte.
De exemplu, când n=5, k=2, Georgel are posibilităţile (1,1,1,1,1), (1,1,1,2), (1,1,2,1),
(1,2,1,1), (2,1,1,1), (2,1,2), deci în total 6 modalităţi.
Soluţie: La fel ca la problema anterioară, pentru a ajunge la nivelul n, Georgel poate urca
ultima dată 1 sau k trepte odată. În cazul în care ultima dată a urcat k trepte, înseamnă
că înainte de acestea a urcat o singură treaptă (altfel nu se mai respectă cerinţele
problemei !), deci vine de la nivelul n-k-1. Obţinem relaţia de recurenţă:
F[n]=F[n-1]+F[n-k-1], pentru n>k,iar valorile iniţiale sunt F[i]=1, pentru i=1,…,k-1 şi
F[k]=2.
4. Blocuri. Georgel are o bandă de dimensiuni 1xn pe care vrea să o acopere cu blocuri
de tip 1x1 negre şi 1x3 roşii. Câte modalităţi de aranjare a blocurilor există?
3
5. Blocuri 1-3. Georgel are o bandă de dimensiuni 1xn pe care vrea să o acopere cu
blocuri de tip 1x1 negre şi 1x3 roşii, astfel încât oricare două blocuri roşii (care pot fi de
orice lungime) să fie separate de cel puţin un bloc negru. Câte modalităţi de aranjare a
blocurilor există?
Soluţie: Este aceeaşi relaţie de recurenţă de la scara 3: F[n]=F[n-1]+F[n-k-1] şi aceleaşi
condiţii iniţiale.
6. Blocuri 1-2-3. Georgel are o bandă de dimensiuni 1xn pe care vrea să o acopere cu
blocuri de tip 1x1 negre, 1x2 verzi şi 1x3 albastre. Câte modalităţi de aranjare a blocurilor
există?
Soluţie: Notăm cu F[n] numărul de posibilităţi de acoperire cerut în enunţ. Ultimul bloc
adăugat poate fi oricare tip de bloc, astfel că din restricţiile impuse rezultă relaţia de
recurenţă: F[n]=F[n-1]+F[n-2]+F[n-3] cu condiţiile iniţiale F[1]=1, F[2]=2, F[3]=3.
Aceste numere sunt cunoscute sub numele de numere Tribonacci.
Termenul Explicaţie
Mai jos sunt reprezentate toate acoperirile posibile pentru o banda de lungime 5:
4
7. X şi O. Fie S[n] o secvenţă de n caractere construită numai din simbolurile X şi O astfel
încât să nu apară două simboluri O alăturate. Care este numărul de secvenţe S[n]?
Soluţie: Notăm cu F[n] numărul de secvenţe. Construim primele secvenţe şi obţinem:
Termenul Explicaţie
Din modul de construire a şirurilor S[n] se observă că toate se obţin din şiruri care încep
cu prefixul X sau OX şi respectă recurenţa lui Fibonacci F[n]=F[n-1]+F[n-2], cu valorile
iniţiale F[1]=2, F[2]=3.
8. Domino 1. O tablă dreptunghiulară de tip 1xn este acoperită folosind piese de domino
de dimensiuni 1x2 şi pătrate de tip 1x1. Câte modalităţi de acoperire a tablei există?
5
9. Domino 2. O tablă dreptunghiulară de tip 2xn este acoperită folosind piese de domino
de dimensiuni 1x2 sau 2x1. Câte modalităţi de acoperire a tablei există?
Soluţie: Notăm cu F[n] numărul de acoperiri ale unei table de tip 2xn. Avem F[1]=1,
F[2]=2. În general, dacă la sfârşit apare o piesă verticală, numărul de acoperiri este dat
de F[n-1] iar dacă apar două piese aşezate orizontal, numărul de acoperiri este F[n-2].
10. Domino 2xn. O tablă dreptunghiulară de tip 2xn este acoperită folosind piese de
domino de dimensiuni 1x2 (de culoare roşie) şi pătrate 2x2 (de culoare galbenă). Câte
posibilităţi de acoperire a tablei există?
Soluţie: Notăm cu F[n] numărul căutat. Ultima coloană poate fi acoperită de un domino
vertical, cu F[n-1], sau un pătrat. Pătratul poate fi format în două moduri: un pătrat 2x2
sau din două dominouri orizontale. Posibilităţile în care dominourile sunt plasate vertical a
fost deja numărate în F[n-1]. Relaţia de recurenţă este F[n]=F[n-1]+2*F[n-2]. Valorile
iniţiale sunt F[1]=1 şi F[2]=3, iar F[3]=5, F[4]=11.
2) În cazul apelului recursiv se ajunge ca unele valori să se calculeze de mai multe ori,
prin ramificarea apelurilor recursive. Eliminarea calculelor redundante se poate face prin
tehnica memoizării care duce la calcularea eficientă a valorilor din şirul lui Fibonacci.
Dezavantajul acestei metode este acela că foloseşte un spaţiu de memorie care depinde
de n, adică O(n).
6
3) Varianta iterativă, folosind vectori este eficientă ca timp, dar consumă un spaţiu de
memorie în funcţie de n, O(n):
1. long Fib(long n)
2. {
3. long i,a,b,c;
4. if(n<=1)return n;
5. a=0;
6. b=1;
7. for(i=2;i<=n;i++)
8. {
9. c=a+b;
10. a=b;
11. b=c;
12. }
13. return c;
14. }
1. long Fib(int n)
2. {
3. long i,a,b;
4. if(n<=1)return n;
5. a=0;b=1;
6. for(i=2;i<=n;i++)
7. {
8. b=a+b;
9. a=b-a;
10. }
11. return b;
12. }
7
6) Varianta iterativă poate fi folosită pentru calcularea termenilor şirului lui Fibonacci
folosind operaţiile cu numere mari:
7) Termenii şirului lui Fibonacci pot fi evaluaţi mai rapid, în timp logaritmic O(log 2n),
folosind metoda matricială. Scriem relaţiile de recurenţă dintre termenii şirului sub forma:
fn+1 = fn + fn-1
fn = fn-1+ fn-2
Fn 1 Fn 1 1 Fn Fn 1
F
n Fn 1 1 0 Fn 1 Fn 2
iar prin inducţie matematică se demonstrează că:
n
Fn 1 Fn 1 1 1 1
F M n , unde M
n Fn 1 1 0 1 0
1, dacă n 0
x x ( x ) , dacă n 2k 1
n k 2
(xk )2 , dacă n 2k
9
Cititorul interesat poate găsi extinderi şi probleme mai dificile
http://infoarena.ro/probleme-de-acoperire-1
http://infoarena.ro/probleme-de-acoperire-2
10