Sunteți pe pagina 1din 15

1) Să se calculeze n!

in varianta iterativa  (rezolvare...)

2) Să se calculeze n! in varianta recursiva  (rezolvare...)

3) Să se calculeze recursiv suma elementelor unui sir  (rezolvare...)

4) Scrieti o functie proprie care realizeaza calculul recursiv al sumei elementelor


unui vector, de n<=10, de nr reale. Scrieti functia main care citeste datele de la
tastatura, calculeaza suma, utilizand functia recursiva anterior definita si afiseaza
valoarea obtinuta (rezolvare...)

5) Să se scrie un program C, pentru rezolvarea cmmdc-ului dintre două numere


întregi fără semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid
prin scăderi). Varianta iterativa (rezolvare...)

6) Să se scrie un program C, pentru rezolvarea cmmdc-ului dintre două numere


întregi fără semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid
prin scăderi). Varianta recursiva (rezolvare...)

7) Să se scrie un program C, pentru rezolvarea cmmdc-ului a n numere întregi fără


semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin
scăderi). Varianta recursiva (rezolvare...)

8) Se considera urmatoarele declaratii şi conventii:


typedef int vector[20]; x – este un vector (sir de elemente) n – este lungimea sa
(n>=1)
Se cere sa se scrie functii recursive pentru a determina, pentru u n vector x de
lungime n, urmatoarele: (rezolvare...)
a. citirea componentelor sirului
b. afisarea elementelor din sir
c. suma componentelor
d. produsul componentelor
e. numarul componentelor negative
f. produsul componentelor pozitive
g. media aritmetica a elementelor
9) Sa se scrie o functie recursiva pentru determinarea sumei cifrelor unui numar
natural (rezolvare...)

10) Sa se scrie o functie recursiva pentru a transforma un numar natural n, din baza
10 în baza k (1<k<=10) (rezolvare...)

11) Se citeste x din Z . Se cere subprogramul pentru calculul functiei Manna-


Pnuelli: (rezolvare...)
x-1, x>=12
F(x)=
F(F(x+2)), x<12
12) Se considera sirul lui Fibonacci (Un) definit astfel:
0, n=0
Un= 1, n=1
Un-1+Un-2, altfel
Se citeste n, un numar natural. Sa se calculeze Un, in varianta
iterativa (rezolvare...)

13) Se considera sirul lui Fibonacci (Un) definit astfel:


0, n=0
Un= 1, n=1
Un-1+Un-2, altfel
Se citeste n, un numar natural. Sa se calculeze Un, in varianta
recursiva (rezolvare...)

Rezolvari
1) Să se calculeze n! in varianta iterativa.
#include<stdio.h>
long int factorial (int n)
{
long int f=1;
for (int i=1; i<=n;i++)
f=f*i;
return f;
}
void main()
{
int n;
printf("Introduceti n= ");
scanf("%d", &n);

if(!n)
printf("0!=1\n");
else
printf("%d!=%ld\n",n,factorial(n));

getchar();
int var;
scanf("%d", var);
}

2) Să se calculeze n! in varianta recursiva.


// factorial(3)=3*factorial(2)=3*2*factorial(1)=3*2*1
#include<stdio.h>
long int factorial (int n)
{
if (n==1) return 1;
else return n*factorial(n-1);
}
void main()
{
int n;
printf("Introduceti n= ");
scanf("%d", &n);

if(!n)
printf("0!=1\n");
else
printf("%d!=%ld\n",n,factorial(n));

getchar();
int var;
scanf("%d", var);
}

3) Să se calculeze recursiv suma elementelor unui sir.


#include<stdio.h>
int suma(int n)
{
if (n==0) return 0;
else return (n + suma(n-1));
}
void main()
{
int n;
printf("Introduceti n: ");
scanf("%d", &n);
printf("Suma elementelor este %d\n",suma(n));

getchar();
int var;
scanf("%d", var);
}

4) Scrieti o functie proprie care realizeaza calculul recursiv al sumei elementelor


unui vector, de n<=10, de nr reale. Scrieti functia main care citeste datele de la
tastatura, calculeaza suma, utilizand functia recursiva anterior definita si afiseaza
valoarea obtinuta.
#include <stdio.h>
#include <conio.h>
int a[10], n;
int Suma (int n, int a[10])
{
if(n==0) return 0;
else return(a[n]+Suma(n-1,a));
}
void main()
{
// Citire date de intrare
printf("Introduceti nr de elemente: ");
scanf("%d", &n);
for (int i=1; i<=n; i++)
{
printf("Elementul [%d] = ", i);
scanf("%d", &a[i]);
}
// Afisarea rezultatelor
printf("Suma = %d", Suma(n,a));

getch();
}

5) Să se scrie un program C, pentru rezolvarea cmmdc-ului dintre două numere


întregi fără semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid
prin scăderi). Varianta iterativa.
#include <stdio.h>
#include <conio.h>

unsigned int cmmdc(unsigned int a, unsigned int b)


{
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}
return a;
}
void main()
{
unsigned int x,y;
printf("Introduceti x: ");
scanf("%u",&x);
printf("Introduceti y: ");
scanf("%u",&y);

if(!x || !y) //daca x=0 sau y=0


printf("cmmdc(%u,%u) = 1\n",x,y);
else
printf("cmmdc(%u,%u) = %u\n",x,y,cmmdc(x,y));

getch();
}

6) Să se scrie un program C, pentru rezolvarea cmmdc-ului dintre două numere


întregi fără semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid
prin scăderi). Varianta recursiva.
#include <stdio.h>
#include <conio.h>

unsigned int cmmdc(unsigned int a, unsigned int b)


{
if(a==b) return a;
else
if(a>b) return cmmdc(a-b,b);
else return cmmdc(a,b-a);
}
void main()
{
unsigned int x,y;
printf("Introduceti x: ");
scanf("%u",&x);
printf("Introduceti y: ");
scanf("%u",&y);

if(!x || !y) //daca x=0 sau y=0


printf("cmmdc(%u,%u) = 1\n",x,y);
else
printf("cmmdc(%u,%u) = %u\n",x,y,cmmdc(x,y));

getch();
}

7) Să se scrie un program C, pentru rezolvarea cmmdc-ului a n numere întregi fără


semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin
scăderi). Varianta recursiva.
#include <stdio.h>
#include <conio.h>

unsigned int cmmdc_2(unsigned int a, unsigned int b)


{
if(a==b) return a;
if(a>b) return cmmdc_2(a-b,b);
else
return cmmdc_2(a,b-a);
}
unsigned int cmmdc_n(unsigned int x[], int n)
{
if (n==2) return cmmdc_2(x[0],x[1]);
else return cmmdc_2(cmmdc_n(x,n-1),x[n-1]);
}
void main()
{
unsigned int x[20];
int n;
printf("Introduceti n: ");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("elementul %d= ",i+1);
scanf("%u",&x[i]);
}
if (n==1)
printf("\nCmmdc-ul numerelor: %u",x[0]);
else
printf("\nCmmdc-ul numerelor: %u",cmmdc_n(x,n));

getch();
}

8) Se considera urmatoarele declaratii şi conventii:


typedef int vector[20]; x – este un vector (sir de elemente) n – este lungimea sa
(n>=1)
Se cere sa se scrie functii recursive pentru a determin a, pentru un vector x de
lungime n, urmatoarele:
a. citirea componentelor sirului
b. afisarea elementelor din sir
c. suma componentelor
d. produsul componentelor
e. numarul componentelor negative
f. produsul componentelor pozitive
g. media aritmetica a elementelor
#include<stdio.h>
#include<conio.h>
/* un tip propriu definit pentru memorarea sirurilor de elemente intregi, cu
o
dimensiune maxima de 20 de componente */
typedef int vector[20];
//functia de citire
void citire(vector x,int n) //n este dimensiunea reala a sirului
{
//citim ultimul element din sir
printf("\telementul %d: ",n);
scanf("%d",&x[n-1]);
if(n>=2)
citire(x,n-1); //apelul recursiv al functiei
}
//functia de afisare
void afisare(vector x,int n) //n este dimensiunea reala (nr. de elem. din
sir)
{
//afisam ultimul element
printf("%d ",x[n-1]);
if(n>=2)
afisare(x,n-1); //apelul recursiv al functiei
}
//adunarea componentelor unui sir
int suma(vector x,int n) //n in acest caz il consideram fiind indice element
dinsir
{
if(n==-1) return 0; //situatia in care nu mai sunt elemente in sir, pozitia
n=-1 nefiind in sir
else return x[n]+suma(x,n-1);
}
//produsul componentelor
int produs(vector x,int n)
{
if(n==-1) return 1;
else return x[n]*produs(x,n-1);
}
//numarul de componente negative
int numar_negative(vector x,int n)
{
//ne pozitionam pe primul element din sir si verificam dc acesta este
negativ
if(n==0) return (x[n]<0); //expresia conditionata va returna 1 in caz de
adv. si 0 in caz de fals
else return (x[n]<0)+numar_negative(x,n-1);
}
//produsul componentelor pozitive
int produs_pozitive(vector x,int n)
{
if(n==0) return (x[n]>0?x[n]:1); /* am folosit operatorul de
conditionare,
care, daca expresia evaluata ca fi adv. se va lua in calcul x[n],
altfel,
valoarea 1 */
else return (x[n]>0?x[n]:1)*produs_pozitive(x,n-1);
}
//media aritmetica a componentelor sirului
float media(vector x, int m, int n) //cu m am notat indicele elementelor,
iar cu n dimensiunea reala a sirului
{
return (float)x[m]/n + ((m!=0)?media(x,m-1,n):0);
/* - am folosit expresia (float) pentru o conversie explicita a
rezultatului
spre un tip real
- prin x[m]/n intelegem un element (in prima faza, acesta fiind
ultimul
element din sir) impartit la numarul total de componente */
}
//functia principala in rulare
void main()
{
vector x; //sirul de elemente
int n; //dimensiunea sa (numarul de componente citite)

//realizarea operatiei de citire a sirului


printf("Dati numarul de elemente: ");
scanf("%d",&n);
printf("Introduceti elementele sirului:\n");
citire(x,n);

//realizarea operatiei de afisare a sirului


printf("Sirul de elemente este: ");
afisare(x,n);

//sumarea elementelor
printf("\nSuma elementelor: %d",suma(x,n-1)); /* am apelat cu n-1, ptr
ca am
spus mai sus ca acest parametru
reprezinta
indicele ultimului element din
sir */
//produsul elementelor
printf("\nProdusul elementelor: %d",produs(x,n-1));
//numarul elementelor negative din sir
printf("\nNumarul elementelor negative: %d",numar_negative(x,n-1));
//produsul componentelor pozitive
printf("\nProdusul elementelor pozitive: %d",produs_pozitive(x,n-1));
//media componentelor din sir
printf("\nMedia componentelor din sir: %.2f",media(x,n-1,n)); /*
primul parametru - sirul,
al doilea parametru - indicele
ultimului element din sir, al treilea
parametru - dimensiunea reala a sirului
(numarul de elemente citite) */
getch();
}
9) Sa se scrie o functie recursiva pentru determinarea sumei cifrelor unui numar
natural. Indicatie: Se izoleaza ultima cifra, iar lui n i se atribuie câtul întreg dintre
vechea valoare şi 10.
#include<stdio.h>
#include<conio.h>

int suma(int n)
{
if(!n) return 0; //!n=daca nu exista n
else return n%10+suma(n/10);
}
void main()
{
int n;
printf("Introduceti numarul: ");
scanf("%d", &n);

printf("Suma cifrelor numarului este: %d", suma(n));

getch();
}

10) Sa se scrie o functie recursiva pentru a transforma un numar natural n, din baza
10 în baza k (1<k<=10). Indicatie: Numarul se împarte la k, se retine restul, câtul se
împarte la k, se retine restul... pâna când câtul este mai mic decât împartitorul.
Rezultatul se obtine prin scrierea în ordine inversa a resturilor obtinute. Tiparirea
restului se face dupa autoapel.
#include<stdio.h>
#include<conio.h>

void transform(int n,int b)


{
int rest=n%b;
if (n>=b) transform(n/b,b);
printf("%d",rest);
}
void main()
{
int n,b;
printf("n="); scanf("%d",&n);
printf("baza="); scanf("%d",&b);
transform(n,b);
getch();
}

11) Se citeste x din Z . Se cere subprogramul pentru calculul functiei Manna-


Pnuelli:
x-1, x>=12
F(x)=
F(F(x+2)), x<12

#include<stdio.h>
#include<conio.h>

int F(int x)
{
if (x>=12) return x-1;
return F(F(x+2));
}
void main()
{
int x;
printf("x="); scanf("%d",&x);
printf("Valoarea functiei este: %d",F(x));

getch();
}
12) Se considera sirul lui Fibonacci (Un) definit astfel:
0, n=0
Un= 1, n=1
Un-1+Un-2, altfel
Se citeste n, un numar natural. Sa se calculeze Un, in varianta iterativa.
#include<stdio.h>
#include<conio.h>

void main()
{
int n,U0=0,U1=1,U2;
printf("n="); scanf("%d",&n);
if(!n) printf("%d",U0);
else
if (n==1) printf("%d",U1);
else
{
for (int i=2;i<=n;i++)
{
U2=U0+U1;
U0=U1;
U1=U2;
}
printf("%d",U2);
}
/*
ptr. n=3
i=2: U2=U0+U1
U0=U1
U1=U2
i=3: U2=U1+U2
*/
getch();
}

13) Se considera sirul lui Fibonacci (Un) definit astfel:


0, n=0
Un= 1, n=1
Un-1+Un-2, altfel
Se citeste n, un numar natural. Sa se calculeze Un, in varianta recursiva.
#include<stdio.h>
#include<conio.h>

int U (int n)
{
if (!n) return 0;
else if (n==1) return 1;
else return U(n-1)+U(n-2);
}

void main()
{
int n;
printf("Introduceti n=");
scanf("%d",&n);

printf("Valoarea sirului in n este: %d",U(n));

getch();

}
Copyright © 2020 info64.ro

Acest site utilizeaza cookie-uri. Navigand in continuare va exprimati acor

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