Documente Academic
Documente Profesional
Documente Cultură
LUCRARE
DE
ATESTAT
ELEV:
PROF. COORD.
MAI 2022
TEMA PROIECT:
1
GENERALITATI
Definitii
Notiunea de recursivitate din programare este derivata in mod natural din notiunea
de recusivitate din matematica, unde o notiune este definita recursiv daca in cadrul
definitiei sale apare insasi notiunea ce se defineste.
Exemple:
-factorial
1 daca n=0
n!=
n *(n-1)! daca n>0
-sirul fibonacci
f(0)=0,
f(1)=1,
f(i)=f(i-1)+f(i-2) pentru i>1.
2
C=adevarat C=adevarat C=adevarat
apel subprogram
(2) (4) (6) (7) (8)
(3) (5)
S (1) (9)
apel S apel S apel S
Revenire in daca C daca C daca C daca C
Programul atunci S atunci S atunci S atunci S C=fals
apelant
(15) (13) (11)
(17) (16) (14) (12) (10)
C=adevarat
apel
subprogram S (2) (4) (6) (7) (8)
(3) (5)
(1)
apel S1 apel S apel S1 C=fals
S1 daca C S1 daca C
revenire in atunci S atunci S (9)
programul (15) (13) (11)
apelant (16) (14) (12) (10)
(17)
Subprogram Subprogram Subprogram Subprogram
S S1 S S1
3
In cazul utilizarii recursivitatii se mai recomanda utilizarea variabilelor globale pentru a se evita
crearea unor dubluri de variabile pe stiva.
Avantajul recursivitatii este acela ca:
- reduce lungimea textului sursa;
- conduce la solutii clare in comparatie cu solutiile iterative.
Recursivitatea se recomanda:
- in problemele ale caror solutii pot fi definite in termeni recursivi;
- in cazul problemelor complexe rezolvate prin backtracking.
Intotdeauna o problema recursiva are si o rezolvare iterativa si invers.
Utilizarea tehnicilor recursive nu conduce intotdeauna la solutii optime. Ca atare, se
recomanda o analiza a eficientei solutiei recursive si a celei nerecursive si alegerea solutiei celei
mai avantajoase
1 daca n=0
n!=
n.(n-1)! daca n>0
Pseudocodul pentru varianta iterativa si cea recursiva:
functia FACT1(i) este: {iterativ}
f:=1;
pentru i=1,n,1 repeta
│ f=f*i
└
FACT1:=f
sfarsit
functia FACT2(i) este: {recursiv}
daca i>0 atunci
│ FACT2=i*FACT2(i-1)
│ altfel
| FACT2=1
└
Sfarsit
citeste n
pentru k=1,n,1 repeta
│ f1=FACT1(k);
│ f2:=FACT2(k);
│ scrie f1,f2
└
stop
Exemplul 2: Sa se genereze un sir de cifre reprezentand scrierea rasturnata a unui numar intreg
si pozitiv intr-o varianta iterativa si una recursiva.
Algoritmul de calcul se bazeaza pe aflarea cifrelor numarului prin impartiri la 10.
procedura INV1(n)este: {iterativ}
repeta
4
│ scrie n mod 10
│ n=n div 10;
└ pana n=0
sfarsit
procedura INV2(n)este: {recursiv}
scrie n mod 10
daca (n div 10)<>0 atunci
│ INV2(n div 10)
└
sfarsit
Programul principal:
n=12345
INV1(n);
INV2(n);
stop
Exemplul 3. Sa se determine cel mai mare divizor comun a doua numere folosind o varianta
recursiva si una iterativa pentru algoritmul lui Euclid.
In varianta iterativa se va folosi algoritmul lui Euclid in varianta clasicia iar in varianta recursiva
se va folosi definitia:
a daca a=b
cmmdc(a,b)=
cmmdc(b,a mod b) daca a<> b
functia CMMDCR(a,b) este:
daca b=0 atunci
│ CMMDC=a
│ altfel
│ CMMDCR=CMMDCR(b,a mod b);
└
sfarsit
functia CMMDCI(a,b) este:
daca a<b atunci
│ r=a;
│ a=b;
│ b=r;
└
r= a mod b;
cat timp r<>0 executa
│ a=b;
│ b=r;
│ r= a mod b;
└
CMMDCI:=a;
sfarsit
Programul principal:
5
scrie ’ dati numerele:'
citeste a,b
c:=CMMDCR(a,b);
scrie'CMMDCR=',c
c:=CMMDCI(a,b);
scrie 'CMMDCI=',c
stop
Sa se calculeze primele n numere din sirul lui Fibonacci folosind o varianta recursiva si
una iterativa.
Sirul numerelor lui Fibonacci 0, 1, 1, 3, 5, 8, 13, 21, ... sunt definite recursiv astfel:
f(0)=0, f(1)=1, f(i)=f(i-1)+f(i-2) pentru i>1.
functia fiboi (n) este: // varianta iterativa
i=1
a=0
b=1
daca(n<=1) atunci
│ fiboi=n
│altfel
│ cat timp (i<=n) repeta
│ │ c=a+b
│ │ a=b
│ │ b=c
│ │ i=i+1
│ └
│ fiboi=c
└
stop
functia fibor (n) este: // varianta recursiva
daca(n<=1) atunci
│ fibor=n
│altfel
│ fibor=fibor(n-1)+fibor(n-2)
└
stop
citeste n
pentru i=1,n,1 repeta
scrie fiboi(i), fibor(i)
stop
Observatie.
De obicei se asociaza o multime de entitati locale unui subprogram, adica variabile, constante,
tipuri care sunt definite local in acel subprogram si care nu au nici o semnificatie in afara ei. In
acest caz de fiecare data cand un asemenea subprogram este activat recursiv, se creaza un nou set
de variabile locale. Desi noile variabile au acelasi nume cu cele existente inainte de activarea
6
subprogramului, valorile lor sunt distincte si orice conflict de nume este evitat de regulile
domeniului de valabilitate al identificatorilor: Identificatorii se refera intotdeauna la ultimul set
de variabile creat. Aceleasi reguli se refera si la parametrii de tip valoare ai subprogramului, care
sunt inglobati prin definitie in subprogram.
Este indicat pe cat posbil a nu se folosi variabile locale in subprograme recursive pentru a nu se
depasi stiva procesorului.
Pentru fiecare apel al procedurii recursive INVSIR se creaza o copie a variabilei locale "ch".
Recursivitatea poate fi transformata in majoritatea cazurilor intr-o iteratie. In general,
forma nerecursiva a unui program este mai eficienta decit cea recursiva in ceea ce priveste
timpul de executie si memoria ocupata.
In alegerea caii recursive sau iterative de a rezolva o problema, programatorul trebuie
sa-si stabileasca bine prioritatile in alcatuirea programului, analizand complexitatea acestuia,
naturaletea exprimarii, usurinta proiectarii si intretinerii programului, eficienta in executie.
Daca problema de rezolvat este de complexitate redusa si programul trebuie sa aiba
eficienta maxima, iar transformarea recursivitatii in iteratii se face usor fara a dauna asupra natu-
raletii algoritmului, este de preferat varianta iterativa (ca in exemplele de mai sus).
In general, clasa de functii definite recursiv:
G(x) , daca n=0
Fn(x)=
H * Fn-1(x) , daca n>0
Astfel, in programul urmator care determina recursiv maximul unui sir, variabilele k, j,
s-au declarat globale si nu locale.
Exemplul 6. Sa se determine maximul unui sir de numere intregi folosind o solutie
recursiva.
functia maxr(i) este:
7
daca i<n atunci
│ daca a[i]>a[j] atunci
│ │ k=i
│ │altfel
│ │ k=j
│ └
│ altfel
│ k=n
│ maxr=k
└
sfarsit
Programul principal:
citeste n
citeste a(i),i=1,n
scrie "Rangul elementului maxim=”,maxr(1)
scrie “Valoarea sa este”, a[maxr(1)]
stop
2. O altă funcţie recursivă cunoscută este funcţia lui Ackermann definită astfel:
A(0,n)=n+1
A(m,0)=A(m-1,1)
A(m,n)=A(m-1,A(m,n-1))
Pentru câteva valori particulare ale argumentelor, valorile acestei funcţii sunt cunoscute:
A(1,n)=n+2;
A(2,n)=2*(n+3)-3;
A(3,n)=2n+3-3.
Datorită gradului mare de recursivitate a acestei funcţii, ea este frecvent folosită ca un
criteriu de evaluare a performanţelor compilatoarelor, indicând eficienţa mecanismului de apel al
procedurilor recursive.
8
REZOLVARE TEORETICA
9
LISTING-UL PROGRAMULUI:
Main
#include <iostream.h>
#include <stdlib.h>
#include "a.h"
#include "b.h"
#include "c.h"
#include "d.h"
#include "e.h"
#include "f.h"
#include "g.h"
#include "h.h"
void main()
{
cout<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@ RECURSIVITATEA
@@@@@@"<<endl;
cout<<" @@ Implementarea recursiva a algoritmilor pentru
prelucrarea @@"<<endl;
cout<<" @@@@@@ tablourilor de memorie
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
int x=1;
while(x==1)
{
char caracter;
cout<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@ TOATE PROGRAMELE DE MAI JOS AU FOST CONSTRUITE CU
AJUTORUL @@@@@"<<endl;
cout<<" @@@@@@@@@@ UNOR SUBPROGRAME RECURSIVE
@@@@@@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@ Programul efectueaza urmatoarele operatii:
@@@@@@"<<endl;
cout<<" @ a)Citeste si afiseaza elementele intregi ale unui
vector. @"<<endl;
cout<<" @ b)Verifica existenta unui element pozitiv intr-un
vector. @"<<endl;
cout<<" @ c)Determina numarul de aparitii ale unui element x intr-
un vector. @"<<endl;
cout<<" @ d)Cauta,intr-un vector ordonat,cu n elemente intregi,
elementul @"<<endl;
10
cout<<" @ cu valoarea intreaga x si afiseaza pozitia in care a
fost gasit. @"<<endl;
cout<<" @ e)Sorteaza crescator un vector cu n numere
reale(selectia directa).@"<<endl;
cout<<" @ f)Genereaza toate permutarile multimii{1,2,...,n}.
@"<<endl;
cout<<" @ g)Genereaza toate aranjamentele multimii{1,2,...,n}
luate cate m. @"<<endl;
cout<<" @ h)Determina cmmdc al elementelor dintr-un vector cu
numere intregi. @"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@ PROGRAM REALIZAT DE Antonescu Albert - clasa a
XII-a A @@@@@"<<endl;
cout<<" @@@@@@@@@@ Prof. BOGDAN GHEORGHIU
@@@@@@@@@@@"<<endl;
cout<<" @@@@@@@@@@ COLEGIUL NATIONAL SPIRU HARET - TECUCI
@@@@@@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" Ce program doriti sa executati?"<<endl;
cout<<" Introduceti caracterul(a,b,c,d,e,f,g sau h):";cin>>caracter;
cout<<endl;
switch(caracter)
{
case 'a':{cin.get();
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@@@@ CITIREA SI AFISAREA ELEMENTELOR INTREGI ALE UNUI
VECTOR. @@@@@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
a(); }break;
case 'b':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@@@@ SA SE VERIFICE DACA EXISTA UN ELEMENT POZITIV IN
VECTOR. @@@@@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
11
b(); }break;
case 'c':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Determina numarul de aparitii ale unui element x intr-un
vector. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
c(); }break;
case 'd':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@ Cautarea,intr-un vector ordonat,cu n elemente
intregi, @@@@@@"<<endl;
cout<<" @@@@@@ a elementului cu valoarea intreaga x si afisarea
pozitiei@@@@@@"<<endl;
cout<<" @@@@@@ in care a fost gasit.
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
d(); }break;
case 'e':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Sa se sorteze crescator un vector cu n numere reale.
@@@"<<endl;
cout<<" @@@@@@ Metoda selectiei directe
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
e(); }break;
case 'f':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
12
cout<<" @@@ Sa se genereze toate permutarile unei multimi -
backtracking. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
f(); }break;
case 'g':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Sa se genereze toate aranjamentele unei multimi -
backtracking. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
g(); }break;
case 'h':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Sa se determine cmmdc al elementelor dintr-un
vector. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
h(); }break;
default:cout<<" Se introduc doar valorile a,b,c,d,e,f,g sau h.";
}
cout<<endl<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@ Doriti sa executati alt program?
@@@@"<<endl;
cout<<" @ Pentru DA introduceti 1, in caz contrar introduceti orice
alt numar. @"<<endl;
cout<<" @ Introduceti numarul
@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
13
cout<<" x="; cin>>x;
system("cls");
}
cout<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<<endl;
cout<<" @@@@@@@ SFARSIT!
@@@@@@@"<<endl;
cout<<" @@@ APASATI ORICE TASTA PENTRU A IESI DIN PROGRAM.
@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<<endl;
}
A
#include<iostream.h>
int v[100],n;
void citeste(int i)
{
if(i<=n)
{cout<<"v["<<i<<"]=";
cin>>v[i];
citeste(i+1);}
}
void afiseaza(int i)
{
if(i<=n)
{cout<<v[i]<<" ";
afiseaza(i+1);}
}
void a()
{
cout<<"Introduceti lungimea logica a vectorului:";
cin>>n;
citeste(1);
cout<<"Elementele citite sunt:";
afiseaza(1);
}
B
#include <iostream.h>
int v1[100],n1;
int pozitiv(int i)
{
if(i>n1)
14
return 0;
else
if(v1[i]>0)
return 1;
else
return pozitiv(i+1);
}
void b()
{int i;
cout<<"Introduceti lungimea logica a vectorului:";cin>>n1;
for(i=1;i<=n1;i++)
{
cout<<"v["<<i<<"]=";
cin>>v1[i];
}
cout<<"Elementele vectorului sunt:";
for(i=1;i<=n1;i++)
cout<<v1[i]<<" ";
cout<<endl;
if(pozitiv(1))
cout<<"S-a gasit cel putin un element pozitiv.";
else
cout<<"Nu s-a gasit niciun element pozitiv.";
C
#include <iostream.h>
int v2[100],n2;
int gasit(int el,int k)
{
if(k==n2)
return (el==v2[n2]);
else
return (el==v2[k])+gasit(el,k+1);
}
void c()
{
int el,i;
cout<<"n=";cin>>n2;
cout<<"Elementul care se cauta:";cin>>el;
for(i=1;i<=n2;i++)
{
cout<<"v["<<i<<"]=";
cin>>v2[i];
}
for(i=1;i<=n2;i++)
15
cout<<v2[i]<<" ";
cout<<endl;
if(gasit(el,1)==0)
cout<<"Elementul "<<el<<" nu exista in vector.";
else
if(gasit(el,1)==1)
cout<<"Elementul "<<el<<" s-a gasit o singura data in
vector.";
else
cout<<"Elementul "<<el<<" exista in vector de
"<<gasit(el,1)<<" ori.";
}
D
#include <iostream.h>
int v3[100],n3,elem;
void cautare(int p,int u,int &pozitia)
{
int m;
if(p<=u)
{
m=(p+u)/2;
if(elem==v3[m])
pozitia=m;
else
if(elem<v3[m])
cautare(p,m-1,pozitia);
else
cautare(m+1,u,pozitia);
}
}
void d()
{
int i,pozitia=0;
cout<<"n=";cin>>n3;
cout<<"Elementul care se cauta=";cin>>elem;
for(i=1;i<=n3;i++)
{
cout<<"v["<<i<<"]=";
cin>>v3[i];
}
cautare(1,n3,pozitia);
if(pozitia==0)
cout<<"Elementul nu exista";
else
cout<<"Elementul se afla pe pozitia "<<pozitia;
16
}
E
#include <iostream.h>
float v4[100];
int n4;
void sortare(int i,int j,int n)
{
float aux;
if(i!=n-1)
{
if(v4[j]<v4[i])
{
aux=v4[i];
v4[i]=v4[j];
v4[j]=aux;
}
if(j!=n-1)
sortare(i,j+1,n);
else
sortare(i+1,i+2,n);
}
}
void e()
{
int i;
cout<<"n=";cin>>n4;
for(i=0;i<n4;i++)
{
cout<<"v["<<i<<"]=";
cin>>v4[i];
}
sortare(0,1,n4);
cout<<"Vectorul ordonat este:";
for(i=0;i<n4;i++)
cout<<v4[i]<<" ";
cout<<".";
}
F
#include <iostream.h>
int n5,st[100],solutii=0;
void init(int k)
{
st[k]=0;
}
int succesor(int k)
{
17
if(st[k]<n5)
{
st[k]++;
return 1;
}
else
return 0;
}
int valid(int k)
{
for(int i=1;i<k;i++)
if(st[i]==st[k])
return 0;
return 1;
}
int solutie(int k)
{
return k==n5;
}
void tipar()
{solutii++;
for(int i=1;i<=n5;i++)
cout<<st[i]<<" ";
cout<<endl;
}
void back(int k)
{
init(k);
while(succesor(k))
{if(valid(k))
if(solutie(k))
tipar();
else
back(k+1);}
}
void f()
{
cout<<"n=";cin>>n5;
cout<<"Permutarile de "<<n5<<" sunt:"<<endl;
back(1);
cout<<"S-au gasit "<<solutii<<" solutii.";
}
G
#include <iostream.h>
int n6,st1[100],solutii1=0,m6;
void init1(int k)
{
18
st1[k]=0;
}
int succesor1(int k)
{
if(st1[k]<n6)
{
st1[k]++;
return 1;
}
else
return 0;
}
int valid1(int k)
{
for(int i=1;i<k;i++)
if(st1[i]==st1[k])
return 0;
return 1;
}
int solutie1(int k)
{
return k==m6;
}
void tipar1()
{solutii1++;
for(int i=1;i<=m6;i++)
cout<<st1[i]<<" ";
cout<<endl;
}
void back1(int k)
{
init1(k);
while(succesor1(k))
{if(valid1(k))
if(solutie1(k))
tipar1();
else
back1(k+1);
}
}
void g()
{
cout<<"n=";cin>>n6;
cout<<"m=";cin>>m6;
cout<<"Aranjamentele de "<<n6<<" luate cate "<<m6<<"
sunt:"<<endl;
back1(1);
19
cout<<"S-au gasit "<<solutii1<<" solutii.";
}
H
#include <iostream.h>
int vector[100],n7;
int cmmdc(int prim,int ultim)
{
int mijloc,y,t;
if(prim==ultim)
return vector[prim];
else
{
mijloc=(prim+ultim)/2;
y=cmmdc(prim,mijloc);
t=cmmdc(mijloc+1,ultim);
while(y!=t)
if(y>t)
y=y-t;
else
t=t-y;
return y;
}
}
void h()
{
cout<<"n=";cin>>n7;
for(int i=1;i<=n7;i++)
{
cout<<"v["<<i<<"]=";
cin>>vector[i];
}
cout<<"Cel mai mare divizor comun este "<<cmmdc(1,n7)<<".";
}
20
BIBLIOGRAFIE:
1.Waite M., Prata St., Martin D. ,”C Primer Plus”, Howard W. Sans & C0, 1986
2.Jamsa K., Klander L.- Totul despre C si C++. Manual fundamental de
programare in C si C++. Teora 2002
3.Schildt H. – C manual complet. Teora 1998
4. Schildt H. – C++ manual complet. Teora 1998
5.Kernighan B., Ritchie D. – The C Programming Language, Printice Hall,1988
6.Cristea V., Kalisz E., Giumale C., Panoiu F.- Limbajul C standard, Teora 1992
7.Marian Gh., si alti- Modele de grile pentru examenele de diploma si absolvire,
Editura Universitaria 2004 ISBN 973-8043-503-3
8.Patrascoiu O., Marian Gh., Mitroi N. – Elemente de grafuri si combinarorica.
Metode, algoritmi si programe, Editura ALL 1993 ISBN 973-571-017-X
9. Patrascoiu O., Mitroi N. , Marian Gh.- Limbajul C, Teorie si programe, Editura
Microcomputer Service, Craiova, 1994.
10.Petrovici V., Goicea F. – Programare in limbajul C, Ed. Tehnica 1988
11.Marian Gh., Badica C., Lascu M.,Iordache S.-Limbajul C-Aplicatii, Editura
Spirit Romanesc, Craiova 1997
12.Mocanu M., Marian Gh., Badica I., C., Badica P., C. - 333 probleme de
programare, Editura TEORA, Bucuresti, 1993.
21
CUPRINS:
Tema proiect…………………………………………………………….1
Generalitati…………………………………………………………..….2
Rezolvare teoretica…………………………………………………..….9
Listing-ul programului………………………………………………...10
Bibliografie…………………………………………………………….21
22