Documente Academic
Documente Profesional
Documente Cultură
profesionale la informatică
Tema: Recursivitate
Profesor coordonator:
Elev:
Clasa:
2022
CUPRINS:
2
ARGUMENT
Am ales acest capitol din programare deoarece este cel mai clar, concis, rapid, usor
de inteles si verificat. Variantele recursive ale problemelor sunt mult mai clare si mai
usor de implementat fata de variantele iterative.
Recursivitatea este folosita cu multa eficienta in matematica. Spre exemplu, definitii
matematice recursive sunt: definitia numerelor naturale, definitia functiei factorial
definitia functiei Ackermann definitia functiei Fibonacci.
Utilitatea practica a recursivitatii rezulta din posibilitatea de a defini un set infinit de
obiecte printr-o singura relatie sau printr-un set finit de relatii.
Recursivitatea s-a impus in programare, odata cu aparitia unor limbaje de nivel inalt,
ce permit scrierea de module ce se autoapeleaza (PASCAL, LISP, ADA, ALGOL, C
sunt limbaje recursive, spre deosebire de FORTRAN, BASIC, COBOL, nerecursive).
3
Capitolul 1: RECURSIVITATEA
Stiva este o succesiune ordonata de elemente, delimitata prin doua capete, in care
adaugarea si eliminarea elementelor se poate face pe la un singur capat, numit
varful stivei. O stiva care nu contine nici un element stiva vida. În orice moment,
putem scoate din stiva numai elementul care a fost introdus ultimul, motiv pentru
care vom spune ca stiva functioneaza dupa principiul LIFO (Last In First Out –
“Ultimul Intrat Primul Iesit”)
Recursivitatea are avantajul ca reduce drastic lungimea textului sursa al unui
program. De aceea solutiile recursive sunt mai clare. Recursivitatea reprezinta o
solutie avantajoasa in cazul problemelor complexe care se rezolva prin backtracking,
in acelea ale caror date sunt definite recursiv sau in problemele ale caror solutii pot fi
definite in termeni recursivi.
Utilizarea tehnicilor recursive nu conduce, insa, intotdeauna la solutii optime,
fiind recomandata analiza eficientei solutiei mai avantajoase in cazul dat. De multe
ori trebuie avut in vedere ca recursivitatea, mai ales cea indirecta poate genera
dificultati deosebite in depanarea programelor.
Spre deosebire de alte limbaje mai vechi (de exemplu Fortran), limbajul C++
rezolva apelurile recursive prin chiar mecanismul apelului subprogramelor.
4
Esential este faptul ca la punerea in executie a unui subprogram, se aloca
spatiu pentru parametrii, valoare si variabilele locale si se intializeaza parametrii
valoare, in conformitate cu valorile parametrilor efectivi.
5
Capitolul 1.1: REGULI PENTRU CONSTRUIREA UNUI PROGRAM
RECURSIV
Corpul unui subprogram recursiv descrie algoritmul folosind doua elemente:
6
Capitolul 2: APLICATII CU SUBPROGRAME RECURSIVE SI
PREZENTAREA ACESTORA
Algoritmul pentru derminarea valorii minime/maxime
Pentru calculul valorii minime dintr-un sir de n numere citite de la tastaturs, se vor
folosi functiile min() si max() care au fost definite recursive.
# include <iostream.h>
main () cout<<”maxim=
”<<x<<endl<<”minim= ”<<y;
3. Daca b!=0 atunci se revine la pasul 1, adica se reia executa functiei atriuindu-se
parametrilor de intrare urmatoarele valori: parametrul a valoarea b, iar
parametrului b valoarea a mod b. Daca b=0, atunci cmmdc=a.
#include <iostream.h>
int main()
Se scade, din numarul mai mare, celalalt numar: daca a >b, se executa operatia de
atribuire a a-b iar daca se b>a se executa operatia de atribuire b=b-a.
7
Daca a!=b, atunci se revine la pasul 1 adica se reia executia functiei atribuindu-se
parametrilor de intrare urmatoarele valori: daca a>b, parametrului a i se atribuie
valoarea a-b, iar daca b>a parametrului b I se atribuie valoarea b-a si in ambele
cazuri, celalalt parametru ramane neschimat.
cmmdc=a.
#include<iostream.h>
int main ()
int main ()
8
#include<iostream.h>
if (p!=0)
cout<<f<<”la puterea”<<p;
int main ()
int main ()
9
Capitolul 3: VARIABILELE LOCALE
10
Capitolul 4: PROBLEME PROPUSE
4.1 Problema 1.
Sa se genereze toate numerele binare cu n cifre care au m cifre de 0 si restul cifrelor
1. Valorile pentru n si m se citesc de la tastatura. Combinatiile posibile de m cifre de
0 si n-m cifre de 1 se vor genera recursiv. Din multimea de combinatii posibile se vor
alege numai acelea care pot forma un numar cu n cifre.
Rezolvarea problemei
Sursa recursiva
#include<iostream.h>
int main()
int v[50],n,m;
vector
void test() /* functia test, testeaza daca numarul convine cerintelor date din
problema, adica daca in numar se afla m cifre de 0; daca da sunt afisate cu ajutorul
functiei anterioare */
void doi_zece(unsigned long &x) /* functia transforma numerele din vector din baza
2 in baza 10 */
11
Avantajele si dezavantajele fiecarei implementari
Avantaje
Varianta recursiva este mai clara si mai usor de implementat.
În general varianta iterativa este mai rapida dar in cazul acestei probleme rapiditatea
programelor depinde de valorile date.
Executia algoritmului iterativ se face intr-o singura etapa, care consta in rezolvarea
problemei pornind de la o valoare initiala cunoscuta, pana la obtinerea valorii
finale(valoarea ceruta), adica 'de jos in sus'.
Dezavantaje
Executia algoritmului recursiv se face in 2 etape: in prima etapa se descompune
problema, pornind de la valoarea ceruta pana la valoarea initiala, cunoscuta, adica
'de sus in jos', iar in a doua, se revolva problema pornind de la valoarea initiala
cunoscuta pana la obtinerea valorii cerute, adica 'de jos in sus”.
4.2 Problema 2
Sursa iterativa:
#include<iostream.h>
void init (int c[100], int n) /* definirea subprogramului init cu parametrii formali:
vectorul cu elementele multimii si numarul de elemente */
void submult (int c[100], int b) /* definesc subprogramul submult pentru afisarea
submultimilor cu parametrii formali vectorul c in care avem elementele multimii si
b, numarul de elemente */ if (i==0) ok=0; else
}
12
Sursa recursiva:
#include <iostream.h>
void rec(int i,int c[],int n) /* definesc subprogramul rec cu parametrii formali i pentru
pozitie, vectorul c si numarul de elemente n; pe care il voi folosi la afisarea
submultimilor */
void init (int c[], int n) /* declarez functia init cu parametrii formali c, vectorul care il
voi initializa cu 0 si numarul de elemente n; care o voi folosi la initializarea vectorului
c cu 0 */
void submult (int c[], int n) /*declarez functia submult cu parametrii formali c,
vectorul folosit la generarea submultimilor si numarul de elemente n; pentru
generarea submultimilor */
if (i==0) ok=0; else
}
int main() /* intru in main pentru a citi n-ul, pentru a apela functiile si pentru a afisa
*/
Avantaje si dezavantaje
Rezolvarea problemei cu ajutorul metodei recursive este mai scurta, mai usor de
urmarit. Este mai clara drept pentru care poate fi inteleasa mai usor. În unele cazuri
este necesara datorita faptului ca sunt lucruri ce pot fi realizate numai prin
intermediul recursivitatii, exemplu ar fi adancimea recursivitatii. Un dezavantaj este
timpul de executie deoarece creste cu cat adancimea este mai mare a recursivitatii,
din cauza timpilor necesari pentru mecanismul de apel si pentru administrarea stivei
de sistem.
4.3 Problema 3
Scrieti un program care sa afiseze termenul n din urmatoarele siruri, cu a0=b0=1:
an=an-1+bn-1;
bn=an-1-bn-1;
13
Sursa iterativa:
#include<iostream.h>
int main()
Sursa recursiva: #include<iostream.h>
an
int main ()
#include<iostream.h>
int main( )
cout<< ac<<” “<<bc<<endl /*la iesirea din for se vor afisa ultimele valori calculate
ale lui a si b*/
Sursa recursiva:
#include<iostream.h>
void generare(long &a,long &b,int k) /*am transmis a si b prin referinta,
deoarece vrem sa se retina ultimele valori ale acestora*/
int n,q;
int main( )
Avantajele si dezantajele implementarilor:
În ambele variante de rezolvare metodele recursive sunt mai lente; variantele
iterative sunt mai rapide datorita faptului ca nu mai realizeaza depunerea si
intoarcerea in stiva.
Totusi, variantele recursive sunt mai clare si mai usor de implementat.
14
4.4 Problema 4
Sa se verifice daca un numar n este superprim. Un numar este superprim
daca toate prefixele sale sunt numere superprime (de exemplu, numarul 171 este
superprim, deoarece toate prefixele sale - 1, 17, 171 - sunt numere prime). Vor fi
implementate recursiv atat subprogramul care testeaza daca un numar este prim,
cat si subprogramul care extrage toate prefixele numarului.
Rezolvarea problemei:
Sursa recursiva:
#include<iostream.h>
#include<conio.h>
int prim(int i,int x) // subprogramul verifica daca un numar
int x;
este prim
int superprim(int x) /* un numar este superprim daca prefixele sale sunt numere
prime, astfel acest subprogram verifica daca prefixul numarului adica numarul div
10 este tot un numar prim */
int main()
Sursa iterativa:
#include<iostream.h>
#include<conio.h>
int x;
int superprim(int x) /* un numar este superprim daca prefixele sale sunt numere
prime, astfel acest subprogram verifica daca prefixul numarului adica numarul div
10 este tot un numar prim */
return ok;
int main()
Avantaje si dezavantaje
15
Rezolvarea problemei cu ajutorul metodei recursive este mai scurta, mai usor de
urmarit. Este mai clara drept pentru care poate fi inteleasa mai usor.
4.5 Problema 5
float polinom(int n,int x,int a[100]) /*functia polinom care calculeaza valoarea
unui polinom cu parametrii n(lungimea vectorului a),x(numarul real),vectorul
a(contine coeficientii acestui polinom) */
int main ( )
16
Avantajele si dezavantajele fiecarei implementari
Varianta iterativa este mai rapida decat cea recursiva. În schimb varianta recursiva
este mai clara, mai usor de citit, si mult mai scurta.
Bibliografie
Informatica, manual pentru clasa a XI-a
Mariana Milosescu
Editura Didactica si pedagogica, 2006
Informatica, manual pentru clasa a X-a
D. Fanache, N. Istrate, M. Duta
Editura Gimnasium, 2000
17