Documente Academic
Documente Profesional
Documente Cultură
Să repetăm: ce înseamnă n!
3!=6
5!=120
dar 0!=1 ? (prin def.)
Dar în C++ cum vom calcula factorialul?
P:=1;
For I:=1 to n do
P:=p*i;
Scrie p;
RECURSIVITATEA ÎN CASCADA
Sa analizam Algoritmul pentru calculul sirului lui Fibonacci în varianta iterativa si în varianta recursiva.
Enunt : Sa se determine primele n numere ale sirului lui Fibonacci, unde n este este un numar natural citit de a
tastatura. (exp: n=8, => {1, 1, 2, 3, 5, 8, 13, 21})
Varianta iterativă
fibo(1) =1
Recursiv
Iterativ
fibo(2)= fibo(0)+fibo(1)=0+1=1
fibo(3) =fibo(1)+fibo(2)=1+1=2
fibo(4)= fibo(2)+fibo(3)=1+2=3
………….
fibo(n) = fibo(n-2)+fibo(n-1)
PROGRAM C++ (varianta iterativa)
#include<iostream>
// n – numarul de elemente;
using namespace std;
// i – contor i€[3,n], deoarece primele doua elemente
int main(){ sunt a1 1 si a2 1;
int n, fibo1=1, f ibo2=1, fibo3, i; // fibo1, fibo2, fibo3 – elementele şirului lui Fibonacci
cout<<"n="; cin>>n;
for (i=3; i<=n; i++) /*se repeta de n-3 ori generarea unui numar al sirului lui
Fibonacci fibo3=fibo1+fibo2; se genereaza un nou element*/
cout<<fibo3<<" ";
fibo1=fibo2;
fibo2=fibo3;
} return 0; }
VARIANTA RECURSIVĂ
#include<iostream>
using namespace std;
int n; //n- variabilă globală
int fibo(int n)
{ // n- este declarat variabila n ca variabilă locală
if (n==0) return 0;
else if (n==1)
return 1;
else return fibo(n-1)+fibo(n-2);
}
int main()
{ // n – numarul de elemente (variabila globala);
cout<<"n="; cin>>n;
cout<< "Termenul "<< n<< " al sirului lui Fibonacci este"<<f ibo(n);
return 0;
Pentru calculul lui fibo(n) este necesar sa se cunoasca fibo(n-1) si fibo(n-2), deci se execută
autoapelul de două ori în cazul general.
Parametrii acestor functii sunt depusi în stivă. Procedeul continuă pâna când este calculat
fibo(n-1), apoi se reia calculul pentru fibo(n-2).
Acest lucru este extrem de ineficient pentru valori mari ale lui n.
Acest tip de recursivitate este un exemplu în care programul iterativ este mult mai eficient
decât programul recursiv.
fibo(4) fibo(3) fibo(2) fibo(1)=1
3 2
+
fibo(0)=0
+ fibo(1)=1
fibo(2) fibo(1)=1
1 +
Adâncimea recursivităţii pentru apelulfibo(0)=0
fibo(4) este 9:
Dacă notăm cu ar(n) adâncimea recursivităţii pentru apelul fibo(n) observăm că:
ar(1)= ar(0)=1
…….
……………
Temă :
1. Să se afişeze toţi termenii şirului lui Fibonacci mai mici decât un numar natural n introdus de la
tastatură. (inclusiv matricea de valori)
an=an-1+bn-1;
bn=(bn-1)2-(an-1)2
Fişa C Fixare de cunoştinţe:
o Încercaţi parcurgerea următoarelor programe în C++ şi matricea de variaţie:
Funcţia returnează o valoare de tip În cazul în care se întâlneşte un divizor a lui x se execută
int instrucţiunea return 0. Astfel apelul funcţiei se încheie.
Funcţia are un parametru formal de
tip int Dacă x este număr prim, instrucţiunea return 0 nu se execută
Rezultatul funcţiei este utilizat în niciodată şi în acest caz, după terminarea execuţiei instrucţiunii for, se
cadrul unei expresii de testare (IF) execută instrucţiunea return 1 (care determină încheierea execuţiei
funcţiei).
#include<iostream.h> #include<iostream.h>
using namespace std; using namespace std;
int suma(int n){ int suma(int n){
int i, s=0 ; if (n==0)
if (n==0) return 0;
return 0; else
else{ return n+suma(n-1);
for (i=1 ; i<=n ; i++) }
s+=i ; // s=s+i int main(){
return s ; int n;
} cout<<"n="; cin>>n;
} cout<<"Suma="<<suma(n)<<endl;
int main(){ return 0;
int n; }
cout<<"n="; cin>>n;
cout<<"Suma="<<suma(n);
return 0;
}
#include<iostream.h> #include<iostream.h>
using namespace std; using namespace std;
int fact(int n){ int fact(int n){
int i, p=1; if (n==0)
if (n==0) return 1;
return 1; else
else{ return n*fact(n-1);
for (i=1 ; i<=n ; i++) }
p=p * i; int main(){
return p; int n;
} cout<<"n="; cin>>n;
} cout<<n<<"!="<<fact(n);
int main(){ return 0;
int n; }
cout<<"n="; cin>>n;
cout<<n<<"!="<<fact(n);
return 0;
}
În varianta iterativa definitia functiei se face În varianta recursiva definitia functiei se face printr-o
printr -o expresie care contine numai valori expresie care contine însăşi functia:
cunoscute. 1 pentru n=0;
1 pentru n=0; Fact(n)=
Fact(n)= n*Fact(n-1) altfel
1*2*3*…*n altfel
În varianta iterativa definitia functiei se face În varianta recursiva definitia functiei se face printr-o
printr -o expresie care contine numai valori expresie care contine însăşi functia:
cunoscute. 0 pentru n=0;
0 pentru n=0; S (n)=
S(n)= n%10+S(n/10) altfel
s+(n%10); n=n/10; altfel
PROGRAM C++ (varianta iterativă) PROGRAM C++ (varianta recursivă)
#include<iostream.h> #include<iostream.h>
using namespace std; using namespace std;
int suma_cifre(int n){ int suma_cifre(int n)
int s=0 ; {
while (n!=0){ if (n==0)
s+=n%10; // s=s+n%10 return 0;
n/=10; // n=n/10 else
} return n%10+suma_cifre(n/10);
return s ; }
} int main(){
int main(){ int n;
int n; cout<<"n="; cin>>n;
cout<<"n="; cin>>n; cout<<"Suma="<<suma_cifre(n);
cout<<"Suma="<<suma_cifre(n); return 0;
return 0; }
}
Test – Subprograme
ce se va afişa :
a) 6 2 2
b) 2 8 8
c) 2 5 5
d) 1 7 7
6. Se consideră funcţia recursivă :
int F(int x)
{
if (x==0) return 0;
else if (x%3 == 0) return F(x/10)+1;
else return F(x/10);
}