Documente Academic
Documente Profesional
Documente Cultură
Recursivitate
Recursivitate este proprietatea functiilor de a se autoapela.
(Un arbore este format din ramuri.
O ramura este formata din ramuri
mai mici.O ramura mai mica este
formata din ramuri si mai mici....)
Structura este formata din:
tip functie_recursiva (parametru formal)
{ ..
..
..
conditie de oprire
ramura de continuare
functie_recursiva (parametru formal modificat)
}
Toate instructiunile din program se executa
de cate ori este apelata functia.
Orice functie recursiva trebuie sa contina
o cinditie de oprire respectiv,de
continuare.
La fiecare reapel al functiei se executa
aceeas segventa de instructiuni
La fiecare reapel,in zona de
stiva a memoriei:
-se ocupa un nivel nou
-se memoreaza valoarea parametrilorformali transmisi prin valoare
-adresa parametrilor formali transmisi prin referinta
-adresa de revenire
-variabilele cu valorile din momentul respectiv
Obs:Toate instructiunile din subprogram se executa pentru fiecare reapel
-se executa instructiunile din functie pana la instructiunea de reapel
-se executa din nou aceeas segventa de instructiuni pana la conditia de oprire
-procedeul se reia pana la intalnirea conditiei de oprire
Pentru fiecare apel s-a salvat in stiva
un nivel,apoi pentru fiecare dintre
aceste apeluri se executa instructiunile
ramase in functie cu valoarea datelor
din varful stivei(atentie!vor fi in
Exemplu:
Se ia secventa de program ce se va afisa pentru n=15,x=2?
void F(int n,int x)
{if (x>n) cout<<0; else if(x%4<=1) F(n,x+1) else {f(n,x+3); cout<<1; } }
Rezolvare: n=15 x=2 x nu este mai mare decat n trecem pe ramura else 2%4=0 este
mai mic decat 1 facem F(15,3) x3%4<=1 => F(15,4)
x 4%4<=1 => F(15,5)
x 5%4<=1 => F(15,6)
x 6%4<=1 (=2) trecem la urmatoru else => F(15,9)
x 9%4<=1 => F(15,10)
x 10%4<=1 (=2) => F(15,13)
x 13%4<=1 => F(15,14)
x 14%4<=1 (=2) => F(15,17)
x
Acum golim stiva
pt fiecare else apelat afisam "1"
Rezultat "01111"
Verificare daca un numar este prim.
#include < iostream.h >
int prim(int n,int d)
{if (d==1) return 1;
else if(n%d==0) return 0;
else return prim(n,d-1);
}
int main()
{int n;
cin>>n;
if (prim (n,n/2)==1) cout<<"este prim"; else cout<<"nu este prim"; }
}
void afisare(int a[20],int n)
if (n>1) afisare(a,n-1);
}
int main()
{cout<<"n="; cin>>n;
citire(a,n);
afisare(a,n);
}
Structuri
Problema:
Pentru elevii unei clase se cunosc numele,prenumele si media.Sa se afiseze numele
elevului cu cea mai mare medie.
#include
struct elev
{char nume[20],prenume[30];
float media;
}a[40],aux;
int n,i,k;
void citire(elev a[40],int &n)
{int i;
cout << "n="; cin >> n;
for(i=1;i<=n;i++) {cout << "nume" << i << ":"; cin >> a[i].nume;
cout << "prenume" << i << ":"; cin >> a[i].prenume;
cout << "medie" << i << ":"; cin >> a[i].medie;
}
}
int maxim(elev a[40],int n)
{int i,k;
float max;
max=0;
for(i=1;i<=n,i++) if(a[i].med>max) {max=a[i].med';
k=i;
}
cout << a[i].nume;
}
int main()
{citire(a,n);
maxim(a,n);
}
Siruri de caractere
Citirea si afisarea:
# include < iostream.h >
10
11
12
13
14
int main()
{char cuv[15];
//citirea
cout << "introdu cuvant";
cin >> cuv;
//afisarea
cout << "cuvant citit" << cuv;
}
Cu cout si cin se pot citi doar siruri ce nu contin caractere albe.
Pentru celelalte se foloseste functia cin.get.