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 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 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:
	 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

#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);
}


// 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);
}


#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);
}


#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();
}


#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();
}


#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();
}


#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();
}


#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();
}


#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();
}


#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();
}


#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();
}


#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();
}


#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();

}
Acest site utilizeaza cookie-uri. Navigand in continuare va exprimati acordul asupra folosirii cookie-urilor.