Sunteți pe pagina 1din 11

COLEGIUL NAȚIONAL „SPIRU HARET” TECUCI

PROIECT
PENTRU SUSȚINEREA EXAMENULUI DE
ATESTARE A COMPETENȚELOR
PROFESIONALE
PROFIL: MATEMATICĂ-INFORMATICĂ

CANDIDAT: PROFESOR ÎNDRUMĂTOR:


APĂVĂLOAEI CRISTINA-ELENA GHEORGHIU BOGDAN
CLASA A XII-A A

2022
COLEGIUL NAȚIONAL „SPIRU HARET” TECUCI

TEMA PROIECTULUI:

ȘIRURI RECUTENTE. STUDIU DE CAZ-ȘIRUL LUI


FIBONACCI

CANDIDAT: PROFESOR ÎNDRUMĂTOR:


APĂVĂLOAEI CRISTINA-ELENA GHEORGHIU BOGDAN
CLASA A XII-A A

2022
Memoriu justificativ

Am ales această lucrare deoarece șirul lui Fibonacci este unul dintre cele
mai importante șiruri recurente ce are aplicabilitate atât în domeniul
informaticii, cât și al matematicii, fiind prezent chiar și în natură unde reprezintă
armonia și perfecțiunea în creație.

3
GENERALITĂȚI

ȘIRURI RECURENTE

Un șir se numește recurent dacă fiecare dintre termenii săi poate fi scris în
funcție de unul sau mai mulți termeni anteriori, excepție făcând primul/primii
termen/i, așa cum se poate observa și următoarele exemple:
- n!=n*(n-1)! Ɐ n≥2, n număr natural sau n!=1 pentru n=0 sau n=1
- progresiile aritmetice, în care a n=an-1+r=a1+(n-1)*r, unde n≥1, n număr
natural, iar rația r și termenii șirului an sunt numere reale
- progresiile geometrice, în care bn=bn-1*q=b1*qn-1, unde n≥1, n număr
natural, iar rația q și termenii șirului bn sunt numere reale

ȘIRUL LUI FIBONACCI

Dintre șirurile recurente existente se remarcă șirul lui Fibonacci, un șir de


numere întregi care este definit astfel: primii doi termeni sunt egali cu 1, sau
primul termen este egal cu 0 iar al doilea cu 1, pe urmă, începând cu cel de al
treilea, fiecare termen este egal cu suma celor două numere care îl preced.
Așadar, putem afirma că un termen oarecare al șirului, începând cu al treilea
este de forma Fn=Fn-1+Fn-2 unde Fn-1=Fn-2+Fn-3,Fn-2=Fn-3+Fn-4 și așa mai departe,
astfel fiind evidențiat caracterul recursiv al șirului.
Pe cât de simplă este relația de recurență, pe atât de important este acest
șir, datorită raportului de aur φ=1,61803, ce se obține împărțind fiecare termen,
începând cu al 13-lea termen atunci când șirul începe cu 1 sau al 14-lea când
șirul începe cu 0, la predecesorul său, dar și a spiralei de aur ce se construiește
pe baza acestui șir și care este considerată a fi prezentă peste tot în lume, de la
diverse construcții, opere de artă, până la viața de pe pământ sau chiar universul.

4
FORMA GENERALĂ A ALGORITMULUI DE
GENERARE A ȘIRULUI FIBONACCI

În generarea primilor n termeni ai șirului Fibonacci se remarcă mai multe


metode de construire a algoritmului, însă voi aborda numai două dintre ele: una
care utilizează o funcție recursivă pentru generarea fiecărui termen și una care
nu utilizează nicio funcție de acest tip.

Algoritmul de generare a șirului Fibonacci utilizând o funcție


recursivă
#include <iostream>
using namespace std;
unsignedfibo(unsigned n)
{
if(n <= 2)
return1;
else
returnfibo(n - 1) + fibo(n - 2);
}
intmain()
{
unsignedn, i;
cin>>n;
for(i= 1; i<= n; i++)
cout<<fibo(i) <<' ';
return0;
}

Comparativ cu algoritmul următor, cel prezentat mai sus este foarte


ineficient în ceea ce privește timpul de executare, deoarece pentru generarea
fiecărui termen, sunt recalculați toți cei precedenți acestuia.

5
Algoritmul de generare a șirului Fibonacci fără a utiliza o
funcție recursivă

#include <iostream>
using namespace std;
intmain()
{
unsignedn, a = 0, b = 0, c = 1;
cin>>n;
if(n == 1)
{
cout<<1;
return0;
}
if(n == 2)
{
cout<<1 <<' ' <<1;
return0;
}
while(n >0)
{
cout<<c <<' ';
a = b;
b = c;
c = a + b;
n = n - 1;
}
return0;
}

6
PROPUNEREA ȘI REZOLVAREA UNEI
PROBLEME

Pentru a demonstra funcționalitatea, dar și modul de lucru al celui mai


eficient algoritm dintre cei doi prezentați, am propus această problemă: Fișierul
„atestat.in” conține, pe prima linie, 2 numere naturale nenule a și b <=32000, cu
a ≤ b ce reprezintă capetele unui interval închis, iar pe a 2-a linie, un număr
natural n aparținând intervalului format de cele două numere de pe prima linie.
Să se scrie, în fișierul „atestat.txt”, pe prima linie, toți termenii aparținând
șirului Fibonacci din interval, mai mici sau egali cu n, iar pe a 2-a linie, toți
termenii aparținând șirului Fibonacci din interval, mai mari sau egali cu n. În
cazul în care nu există niciun astfel de număr, se va afișa mesajul "nu există"
sau se va afișa valoarea 0 pe linia corespunzătoare. În cazul în care n este
termen Fibonacci, va fi afișat pe ambele linii.
În rezolvarea acestei probleme am utilizat următoarele variabile:
 a și b, numere naturale ≤ 32000 pentru a memora capetele intervalelor;
 variabila n pentru a memora termenul de pe a 3-a linie a fișierului;
 x=0, y=1, z=1 pentru a mă ajuta în a genera termenii Fibonacci, primul
element al șirului considerându-l a fi 1;
 sw=0 care îmi va permite finalizarea cerinței;
După ce am realizat citirea din fișierul „atestat.in” a intervalului [a,b] și a
variabilei n ce aparține acestuia, am calculat primul termen Fibonacci mai mai
mare sau egal cu a. Are loc deschiderea fișierului „atestat.txt”, unde se vor face
toate afișările. În structura repetitivă „cât timp” a urmat afișarea și generarea
tuturor termenilor Fibonacci, reprezentați de variabila z, mai mică decât n. În
funcție de numărul acestora, variabila sw va lua valoarea 0, 1 sau valoarea 2
daca n este termen Fibonacci. Dacă n este termen Fibonacci, este afișat pe prima
linie, se trece la cea de a doua, este afișat din nou și se reia procesul de generare
a termenilor mai mici sau egali cu b ce aparțin șirului. Daca sw=0, înseamnă că
nu s-a găsit niciun termen Fibonacci în [a,n], ceea ce deschide posibilitatea
afișării mesajului „Nu există”. Dacă termenul z este mai mare decât b, înseamnă
că nu există niciun termen al șirului în [a,b], astfel se afișează mesajul „Nu
există”, în caz contrar, se afișează valoare 0 pe prima linie, se trece la
următoarea și se generează și afișează termenii Fibonacci mai mici sau egali cu
b.
7
LISTING-UL PROGRAMULUI:
#include <iostream>

#include <fstream>

using namespace std;

intmain()
{
unsignedx = 0, y = 1, z = 1, a, b, sw= 0, n;
ifstreamf("atestat.in");
f >>a >>b >>n;
f.close();
while(z <a)
{
x = y;
y = z;
z = x + y;
}
ofstreamg("atestat.txt");
while(z <n)
{
g <<z <<' ';
x = y;
y = z;
z = x + y;
sw= 1;
}
if(z == n)
{
g <<n <<endl;
sw= 2;
}
if(sw== 2)

8
while(z <= b)
{
g <<z <<' ';
x = y;
y = z;
z = x + y;
}
else
if(sw== 0 &&z >b)
{
g <<"Nu exista";
g.close();
return0;
}
else
{
if(sw== 0)
g<<0;
g <<endl;
sw= 0;
while(z <= b)
{
g <<z <<' '; Dacă în fișierul „atestat.in” se află
x = y; numerele:
y = z; 50 103
z = x + y; 89
sw= 1;
} Atunci în urma executării
if(sw== 0) algoritmului, în fișierul „atestat.txt” s-
au scris valorile:
g<<0;
} 55 89
g.close(); 89
return0;
}

9
BIBLIOGRAFIE:
 https://ro.wikipedia.org/wiki/Sec
%C8%9Biunea_de_aur
 https://tutoriale-pe.net/sirul-lui-fibonacci-in-c/
 https://ro.wikipedia.org/wiki/Rela
%C8%9Bie_de_recuren%C8%9B%C4%83
 https://ro.wikipedia.org/wiki/Numerele_Fibonacci
 https://www.scribd.com/doc/85340916/Recursivitate

10
CUPRINS
1. Memoriu justificativ...................................................................3
2. Generalități privind tema abordată.............................................4
3. Forme generale ale algoritmului corespunzător temei...............5
4. Propunerea și rezolvarea unei probleme....................................7
5. Listing-ul programului...............................................................8
6. Bibliografie...............................................................................10

S-ar putea să vă placă și