Documente Academic
Documente Profesional
Documente Cultură
Iteraia presupune execuia repetat a unei poriuni de program, pn n momentul cnd se ndeplinete o anumit condiie. Fiecare execuie se duce pn la capt, se verific ndeplinirea condiiei, i, la un rspuns nesatisfctor se reia execuia de la nceput (while, do-while, for). Recursivitatea presupune de asemenea execuia repetat a unei poriuni de program. In contrast cu iteraia ns, n cadrul recursivitii condiia este verificat n decursul execuiei portiunii de program (nu la sfiritul ei ca la iteraie) i, n caz de rezultat satisfctor, ntreaga poriune de program este apelat din nou ca subprogram a ei nsi, n particular ca procedur a poriunii de program originale care ns nu i-a terminat execuia. In momentul satisfacerii condiiei de revenire, se reia execuia programului apelant exact din punctul din care s-a apelat pe el nsui. Acest lucru este valabil pentru toate apelurile anterioare satisfacerii condiiei.
Recursivitatea (2)
Structurile de program necesare i suficiente n exprimarea recursivitii sunt subrutinele (funciile) care pot fi apelate prin nume. Dac o subrutina P conine o referin direct la ea nsi se spune c este direct recursiv; dac P conine o referin cu o alt subrutina Q, care la rndul ei conine o referin (direct sau indirect) la P, se spune c P este indirect recursiv
Recursivitatea (3)
unei subrutine i se asociaz un set de obiecte ale subrutinei (variabile, constante, tipuri, parametri), care sunt definite local n subrutina i care nu exist sau nu au neles n afara acesteia. de fiecare dat cnd o astfel de subrutina este apelat recursiv, se creeaz un nou set de astfel de obiecte locale, specifice apelului. dei aceste obiecte au acelai nume ca i cele corespunztoare lor din instana anterioar a subrutinei (n calitate de program apelant), ele au valori distincte i orice conflict de nume este evitat prin regulile care stabilesc domeniul identificatorilor: identificatorii se refer ntotdeauna la setul cel cel mai recent creat de obiecte. Aceleai reguli sunt valabile si in cazul parametrilor subrutinei, asociai prin definiie cu setul de variabile.
Recursivitatea (4)
procedurile recursive necesit evaluarea unei condiii de terminare, fr de care un program recursiv duce la o bucl de program infinit. aplicaiile practice au demonstrat c, dei teoretic recursivitatea poate fi infinit, practic ea nu numai c este finit, dar adncimea sa este relativ mic: fiecare apel recursiv al unei subrutine necesit alocarea unui volum de memorie destinat obiectelor (variabilelor) sale curente; in plus, alturi de acestea mai trebuie memorat i starea curent a programului, cu scopul de a fi refcut atunci cnd noua activitate a subrutinei se termin i urmeaz ca cea veche s fie reluat
Mecanismul recursivitatii
int fact(int n) { int rez; if(n==1) return 1; else rez = n*fact(n-1); cout << Gata functia fatorial de ! << n; return rez; } void main() { int i; for(i=1; i<12; i++) cout<<"Factorial de "<< i <<" este: "<< fact(i)<<"\n"; }
Algoritmi de divizare
Algoritmi pentru aflarea extremelor valorilor componentelor unui vector.
include <stdio.h> #include <stdlib.h> #define n 8 typedef struct { int inf, sup; } limite; div_t y; int a[n+1]; limite *domeniu(int i,int j) { int mijloc; limite *l1, *l2, *l; l1=(limite*)malloc(sizeof(limite)); l2=(limite*)malloc(sizeof(limite)); l=(limite*)malloc(sizeof(limite)); if (j<=i+1) { if (a[i]<a[j]) { l->inf=a[i]; l->sup=a[j]; } else { l->inf=a[j]; l->sup=a[i]; } } else { mijloc=(i+j)/2; l1=domeniu(i,mijloc); l2=domeniu(mijloc+1,j); if (l1->sup>l2->sup) l->sup=l1->sup; else l->sup=l2->sup; if (l1->inf<l2->inf) l->inf=l1->inf; else l->inf=l2->inf; } return l; } void main() { int m,k; limite *lim; for (k=1;k<=n;k++) { printf("a[%d]=",k); scanf("%d", &a[k]); } lim=domeniu(1,n); printf("valoarea minima este %d iar maxima %d", lim->inf, lim->sup); }
Algoritmi de divizare
Algoritm pentru determinarea permutrilor primelor n numere naturale
#include <stdio.h> #include <stdlib.h> #define n 5 int a[n]; else { for (i=0;i<=k;i++) { x=a[i];a[i]=a[k];a[k]=x; permut(k-1); x=a[i];a[i]=a[k];a[k]=x; } } } void main() { int i; for (i=0;i<=n-1;i++) a[i]=i+1; printf("rezultatul este "); permut(n-1); }
void permut(int k) { int x,i; if (k==0) { for (i=0;i<=n-1;i++) printf("%d", a[i]); printf("\n"); }
#include <stdio.h> #include <stdlib.h> #include <conio.h> #define n 8 char z[n+2]; int i,k,x; void p(int m) { if (m>1) { k=k+1; z[k]='.';p(m-1); z[k]='_';p(m-2); k=k-1; }
else { printf(" "); for (i=1;i<=k;i++) printf("%c",z[i]); if (m==1) printf("."); printf("\n"); } } void main() { int x; for (x=1;x<=n;x++) { k=0; printf("\n"); p(x); getch(); } }
void p(int x,int y) { if (m[x][y]==' ') { m[x][y]='+'; a=div(x,n); b=div(y,n); if ((a.rem==0) || (b.rem==0)) tipar(); else { p(x+1,y); p(x,y+1); p(x-1,y); p(x,y-1); } m[x][y]=' '; } }
Algoritmi de backtracking
Problema turneului calului pe o tabla de sah (1)
function incearca; { se initializeaza selecia micrilor; se selecteaz candidatul urmtor din lista micrilor urmtoare; if este acceptabil then { nregistreaz micarea; if solutia nu e completa then { ncearc micarea urmtoare; if not reuita then terge nregistrarea anterioar } } until (micare reuit) or (nu mai exist candidai) };
Reprezentarea amenintarilor
int x[1..8]; bool a[1..8]; bool b[b1 = 2..b2 = 16]; bool c[c1 = 0..c2 = 14];
unde: - x[i] precizeaza pozitia reginei in coloana i - a[j] = true precizeaza ca nici o regina nu ameninta rindul j - b[k] = true precizeaza ca nici o regina nu ameninta diagonala K - c[k] = true precizeaza ca nici o regina nu ameninta diagonala K
Conditia sigura este indeplinita daca cimpul (i,j) destinatie apartine unui rind si unor diagonale care sunt libere (true), astfel:
if a[j] and b[i+j] and c[i-j+7]