Sunteți pe pagina 1din 5

Exemple recusivitate metoda reducerii, metoda divide

Exemplu cu cele doua variante


#include <stdio.h>
#include <conio.h>
double max1(double *a, int s, int d)
{ double x1,x2,m;
if (s==d)
m=a[s];
else
{ x1=max1(a,s,(s+d)/2);
x2=max1(a,(s+d)/2+1,d);
if (x1>x2)
m=x1;
else
m=x2;
}
return m;
}
double max2(double *a,int n)
{ double x1;
if (n==0)
return a[0];
else
{ x1=max2(a,n-1);
if (x1>a[n-1])
return x1;
else
return a[n-1];
}
}
void main()
{ int i,n;
double *v, max;
printf("\nDimensiunea vectorului:");
scanf("%i",&n);
v=new double[n];
printf("Elementele vectorului\n");
for(i=0;i<n;i++)
scanf("%lf",&v[i]);
max=max1(v,0,n-1);
printf("\nElementul maxim:%8.3f",max);
max=max2(v,n);
printf("\nElementul maxim:%8.3f",max);
delete v;
getch();
}

1. Sa se determine produsul scalar dintre doi vectori.


float ps(float *x, float *y, int n)
{ float s;
if (n==0) s=0;
else s= ps(x,y,n-1)+x[n-1]*y[n-1];
return s;
}
2. Sa se determine numarul de elemente negative dintr-un vector.
int numara(float v[], int n)
{ int nr;
if( n == 0) nr = 0;
else {nr=numara(v,n-1);nr+=(v[n-1]<0)?1:0;}
return nr;
}
3. Suma elementelor pare dintr-un vector
float suma(float *v, int n)
{ if (n==0) return 0;
else return suma(n-1) + (v[n-1]%2==0)*v[n-1];
}
4. Ridicarea unei matrice la o putere data
void putere_m(float a[][10], float b[][10], int n, int p)
{
int i,j,k;
float c[10[10];
if (p==0)
for(int i=0;i<n;i++)
for(j=0;j<n;j++) b[i][j]=i==j?1:0;
else
{putere_m(a,b,n,p-1);
//c=b*a; a se realiza inmultirea
//b=c; a se realiza atribuirea
}

5. S se scrie subprogramul C pentru cutarea unei valori date ntr-un vector ordonat
(cutarea binar).
int cauta_binar(float *v,int li,int ls,float k)
{ int mij;
if(li>ls)
return -1;
int mij=(li+ls)/2;
if(v[mij]==k)
return mij;

if(v[mij]>k)
return cauta_binar(v,li,mij-1,k);
return cauta_binar(v,mij+1,ls,k);
}

6. Determinarea cmmdc-ului dintr-un ir de numere naturale


int cmmdc(int a[100], int s, int d)
{ if(s==d) return a[s];
else
{ int x,y;
x=cmmdc(a,s,(s+d)/2);
y=cmmdc(a,(s+d)/2+1,d);
while(x!=y)
if(x>y) x=x-y;
else y=y-x;
return x;
}
}

7. S se scrie subprogramul C care determin prima apari ie a unei valori date ntr-un
vector sortat. Cutarea se va realiza secven ial.
int cauta_s(float *v,int i, int n,float k)
{ int poz;
if( (i==n) || (k<v[i]) )
poz=-1;
else
if(k==v[i])
poz=i;
else
poz=cauta_s(v,i+1,n,k);
return poz;
}

8. S se scrie programul C pentru sortarea cresctoare prin interclasare a unei secvene de


numere reale.
#include <stdio.h>
#include<conio.h>
float v[100];
void interclasare(float *x,int n,int m,int p)
{ float sup[100];
int i,j,k;
for(i=n,j=m+1,k=0;(i<=m)&&(j<p+1);k++)
if(x[i]<x[j])
sup[k]=x[i++];
else
sup[k]=x[j++];

if(i>m)
for(;j<p+1;k++,j++)
sup[k]=x[j];
else
for(;i<=m;i++,k++)
sup[k]=x[i];
for(i=n;i<p+1;i++)
x[i]=sup[i-n];
}
void sort_int(int li,int ls)
{ int mij;
if(li<ls)
{ mij=(li+ls)/2;
sort_int(li,mij);
sort_int(mij+1,ls);
interclasare(v,li,mij,ls);
}
}
void main()
{ int i;
unsigned n;
printf("Dimensiunea");
scanf("%u",&n);
for(i=0;i<n;i++)
scanf("%f",&v[i]);
sort_int(0,n-1);
printf("\nVectorul sortat ");
for(i=0;i<n;i++)
printf("%8.3f ",v[i]);
getch();
}
9. S se scrie subprogramul C pentru sortarea cresctoare prin inserare a unei secven e de
numere reale.
void insera(float *v,int n,float x)
{ int i,j;
for(i=0; (i<n) && (x>v[i]); i++);
for(j=n; j>=i+1; j--)
v[j]=v[j-1];
v[i]=x;
}
void inssort(float *v,int n)
{ if(n)
{ inssort(v,n-1);
insera(v,n-1,v[n-1]);
}
}

10. Metoda bisectiei


Funcia are ca parametri de intrare capetele intervalului n care se caut soluia (x0 i x1),
numrul maxim de iteraii (n), precizia dorit (eps), funcia asociat ecuaiei (f) i adresa unde se
va nscrie soluia. Prin numele funciei se returneaz un cod de eroare cu urmtoarea semnificaie:
0 nu s-a gsit soluie datorit numrului prea mic de iteraii sau preciziei prea mari cerute; 1 sa obinut soluia exact; 2 s-a obinut o soluia aproximativ; 3 intervalul dat nu conine nici o
soluie.
#include <stdio.h>
#include <conio.h>
#include<math.h>
float f(float x)
{ return (2*pow(x,3)-pow(x,2)+x-2);
}
int bisectie(float x0,float x1,unsigned n,float eps,float (*f)(float),float *sol)
{ int cod;
if ((*f)(x0)*(*f)(x1)>0) cod=3;
else if (n==0) cod=0;
else {*sol=(x0+x1)/2;
if((*f)(*sol)==0) cod=1;
else if(fabs(x0-x1)<=eps) cod=2;
else {if((*f)(*sol)*(*f)(x0)<0)
cod=bisectie(x0,*sol,n-1,eps,f,sol);
else cod=bisectie(*sol,x1,n-1,eps,f,sol);}
return cod;}
void main()
{ float eps,x0,x1,x2;
int n;
printf("x0= ");
scanf("%f",&x0);
printf("x1= ");
scanf("%f",&x1);
printf("n= ");
scanf("%d",&n);
printf("eps= ");
scanf("%f",&eps);
switch (bisectie(x0,x1,n,eps,f,&x2))
{ case 0:{ printf("Nu s-a gasit nici o solutie !"); break; }
case 1:{ printf("Solutia exacta: %f",x2); break; }
case 2:{ printf("Solutia aproximativa: %f",x2); break; }
}
getch();
}

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