Documente Academic
Documente Profesional
Documente Cultură
Recursivitate
Aspecte teoretice
}
3. in functia main:
- se declara si se citeste n-ul
- se afiseaza rezultatul prin apelarea functiei factorial (n)
c) folosind o functie pentru calcul (cu parametru transmis prin referinta)
1. biblioteci
2. functie factorial:
void factorial(intreg n, intreg *rezRef)
{ *rezRef=1;
Executa {
*rezRef = *rezRef * n;
n--;
}
Atat timp cat (n!=0);
}
3.in functia main:
- declarare n si rez de tip intreg
- se citeste n;
- se apeleaza functia factorial (), exp: factorial(n, &rez2);
- se afiseaza rezultatul rez2
d) folosind o functie recursiva
1. biblioteci
2. functie factorial (metoda 1):
Intreg fact1(intreg n)
{
daca (n == 0)
return 1;
intoarce (n * fact1(n - 1));
}
3. functie factorial (metoda 2) - recursivitate folosind un argument suplimentar; acc
(acumulator) e 1 initial, varianta recomandata pentru numar mare de apeluri; acc
=1*2*3*4*5...
intreg fact2(intreg n, intreg acc)
{ daca (n == 0)
intoarce acc;
intoarce fact2(n - 1, acc * n);
}
4. in main:
- declarare n intreg;
- citire n;
- apelare functii pentru factorial:
printf("\n%d! = %d\n", n, fact1(n));
printf("\n%d! = %d\n", n, fact2(n, 1));
3. Scrieti programul care identifica valoarea unei pozitii din cadrul sirului lui
Fibonacci (sirul lui Fibonacci: n= 1,1,2,3,5,8,13 ). Se va rezolva prin urmatoarele
variante:
a) clasic, in functia main (o singura functie)
b) cu parametru transmis prin valoare
c) cu parametru transmis prin referinta
d) folosind o functie recursiva
Exemplu numeric:
n=5
fibo(5)=5
Indicatii
a)
1.
2.
-
in main:
se declara intregi: n, rez1=1, rez2=1;
se citeste pozitia din sir (n);
se afiseaza valoarea din sir pentru pozitia solicitata ( printf("termenul de pe pozitia %d
este %d ", n ,sirFibo(n)) );
1. biblioteci
2. functia sirFibo:
void sirFibo (intreg m, intreg *rezFinal)
{
intreg i, rez1=1, rez2=1;
daca ((m==1) || (m==2)) *rezFinal=1;
altfel
pentru (i=3;i<=m;i++)
{
*rezFinal = rez1+rez2;
rez1=rez2;
rez2= *rezFinal;
}
}
3.in main:
- se declara intregi : n, rez1=1, rez2=1, rezFinal2;
- se citeste pozitia din sir (n)
- se apeleaza functia sirFibo si se afiseaza rezultatul:
sirFibo (n, &rezFinal2);
printf("termenul de pe pozitia %d este %d ", n , rezFinal2);
3. in main:
- se declara integi x si y;
- se citesc x si y de la tastatura;
- afisare rezultat:
daca (!x || !y)
//daca x=0 sau y=0
6
main:
Declarare intregi: x,y;
Se citesc x si y
Afisare rezultat:
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));
Tema:
1. Scrieti un subprogram recursiv care calculeaza aranjamente de n luate cate k
(A(n,k)=n*A(n-1,k-1).
2. Scrieti un subprogram recursiv care calculeaza combinari de n luate cate k
3. Scrieti un subprogram recursiv care calculeaza numarul de elemente negative dintr-un
vector.
4. Scrieti un subprogram recursiv care calculeaza suma elementelor pare dintr-un vector.
5. Scrieti un program recursiv care rezolva problema turnurilor din Hanoi
6. Sa se scrie o functie recursiva pentru determinarea sumei cifrelor unui numar natural.
7
Indicatii
1. Biblioteci ce trebuie incluse: stdio.h, conio.h, stdarg.h, malloc.h
2.
int *lista_var2 (int *nr, ...)
{int i, *v, t;
va_list p; //va_list este tip declarat in stdarg.h.
/* va_list este un pointer catre lista de parametrii. In functia utilizator corespunzatoare
(lista_var2) trebuie declarata o variabila (numita p) de acest tip, care va permite adresarea
parametrilor*/
v=(int*)malloc(100*sizeof(int));
va_start(p, nr); //initializeaza variabila p cu adresa primului parametru din sublista variabila.
// Prototip: void va_start (va_list p, ultim), aici ultim = nr (numele ultimului
parametru din sub lista variabila).
*nr=0;
t=va_arg(p,int);// va_arg intoarce valoarea parametrului din sublista variabila.
//Prototip: tip_element va_arg(va_list p, tip_element), unde tip_element este tipul
elementului transferat din lista.
//Dupa fiecare apel al functiei va_arg, variabila p este modificata astfel incat sa
indice urmatorul parametru
while(t)
{ v[*nr]=t;
(*nr)++;
t=va_arg(p,int);
}
va_end(p); // va_end incheie operatia de extragere a valorilor parametrilor si trebuie apelata
inainte de revenirea din functie
// prototip: void va_end(va_list p)
free(v);
return v;
}
8
3. In main:
se declara: int *x, i,n;
x=lista_var2(&n, 1, 3, 3, 5, 20, 0); //apelare functie
apoi se afiseaza vectorul x.