Sunteți pe pagina 1din 10

C: Recursivitate - aplicatii rezolvate

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 fr semn
(pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). Varianta iterativa
(rezolvare...)
6) S se scrie un program C, pentru rezolvarea cmmdc-ului dintre dou numere ntregi fr semn
(pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). Varianta
recursiva (rezolvare...)
7) S se scrie un program C, pentru rezolvarea cmmdc-ului a n numere ntregi fr semn (pentru
determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). 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 un 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:


Un=

0, n=0
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:
Un=

0, n=0
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)
else

printf("0!=1\n");
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)
else

printf("0!=1\n");
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 fr semn
(pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). 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 fr semn
(pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). 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 fr semn (pentru


determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). 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 determina, 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);

ca am

//sumarea elementelor
printf("\nSuma elementelor: %d",suma(x,n-1)); /* am apelat cu n-1, ptr

reprezinta
sir */

spus mai sus ca acest parametru


indicele ultimului element din

//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,

ultimului element din sir, al treilea


(numarul de elemente citite) */
getch();
}

al doilea parametru - indicele


parametru - dimensiunea reala a sirului

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 ctul ntreg dintre vechea valoare i 10.
#include<stdio.h>
#include<conio.h>

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

//!n=daca nu exista 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, ctul se mparte la k, se retine
restul... pna cnd ctul este mai mic dect 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:

F(x)=

x-1, x>=12

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:


Un=

0, n=0
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:


Un=

0, n=0
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();
}

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