Fact(4)=4*Fact(3)
|
Fact(4)=4*Fact(3)
|
Fact(4)=4*Fact(3)
|
Fact(4)=4*Fact(3)
|
Fact(4)=4*6
|
Fact(4)=24
|
Fact(3)=3*Fact(2)
|
Fact(3)=3*Fact(2)
|
Fact(3)=3*Fact(2)
|
Fact(3)=3*2
|
|
|
Fact(2)=2*Fact(1)
|
Fact(2)=2*Fact(1)
|
Fact(2)=2*1
|
|
|
|
Fact(1)=1*Fact(0)
|
Fact(1)=1*1
|
|
|
|
|
Fact(0)=1
|
|
|
|
|
|
Rekursiv funktsiyalarni to’g’ri amal qilishi uchun rekursiv chaqirishlarning to’xtash sharti bo’lishi kerak. Aks holda rekursiya to’xtamasligi va o’z navbatida funktsiya ishi tugamasligi mumkin. Faktorial hisoblashida rekursiv tushishlarning to’xtash sharti funktsiya parametri n qiymati 0 bo’lishidir (shart operatorining rost shoxi).
Har bir rekursiv murojaat qo’shimcha xotira talab qiladi – qnomprogrammaning lokal obyektlari (o’zgaruvchilari) uchun har bir murojaatda stek deb nomlanuvchi xotira segmentidan yangidan joy ajratiladi. Masalan, rekursiv funktsiyaga 100 marta murojaat bo’lsa, jami 100 lokal obyektlarning majmuasi uchun joy ajratiladi. Chu sababli juda ko’p rekursiya bo’lganda, stek o’lchami cheklanganligi sababli (real rejimda 64Kb o’lchamgacha) u to’lib ketishi mumkin va bu holda programma o’z ishini «Stek to’lib ketdi» xabari bilan to’xtadi.
Rekursiya chiroyli, ixcham ko’ringani bilan xotirani tejash va hisoblash vaqtini qisqartirish nuqtayi-nazaridan imkon qadar uni iterativ hisoblash bilan almashtirilgani ma’qul hisoblanadi. Masalan, x-haqiqiy sonini n butun darajasini hisoblashni quyidagi yechim varianti nisbatan kam resurs talab qiladi:
double Butun_Daraja(double x, int n)
{
double p=1;
for (int i=1; i<=n; i++) p*=x;
return p;
}
Lekin shunday masalalar borki, ularni yechishda rekursiya juda samarali, hattoki yagona usuldir. Xususan, grammatik tahlil masalalarida rekursiya o’ng’ay hisoblandi.
Qaytayuklanuvchi funktsiyalar.
Ko’pincha bitta algoritmni xar xil turdagi qiymatlar uchun ishlatiladi. Chunda u algoritmlarni nomlari bir xil bo’lgani ma’quldir. Bir nechta funktsiyani bir xil nom lekin xar xil turdagi parametrlar bilan ishlatish fuktsiyani qayta yuklash deyiladi.
Kompilyator parametrni turlariga va soniga qarab mos bo’lgan funktsiyani chaqiradi. Bunday amalni xal qilish amali deyiladi va uning maqsadi parametrlaga ko’ra eng to’g’ri keladigan funktsiyani chaqirishdir , agar bunday funktsiya topilmasa kompilyatr xato degan xabar beradi, Funktsiyani aniqlashda qaytarish qiymatni turi axamiyati yo’q. Misol:
#include
int max(int, int);
char max(char,char);
float max(float,float)
int max(int,int,int);
void main()
{ int a,int b, char c, char d,int k,float x,y;
cin >> a>>b>>k>>c>>d>>x>>y;
cout << max(a,b)<}
int max(int i,int j){return (i>j)?i:j;}
char max(char s1,char s2){ return (s1>s2) ? s1:s2;}
float max(float x,float y){return (x>y)?x:y;}
int max(int i,int j,int k){ return (i>j)?(i>k)?i:k?(j>k)?j:k;}
Agar parametrlar turi to’g’ri funktsiyalarni birorta turiga to’g’ri kelmasa ular keltiriladi kuyidagi qoyda bo’yicha bool va char intga , float doublega va int doublega.
Qaytayuklanuvchi funktsiyalar kuyidagi qoydalarga rioya qilmoq kerak:
-qaytayuklanuvchi funqtsiyalar bir ko’rinish soxasida bo’lishi kerak;
-qaytayuklanuchi funktsiyalarda kelishuv bo’yicha parametrlar ishlatilsa , bunday parametrlar barcha qaytayuklanish funktsiyalarda xam ishlatilishi kerak va bir xil qiymatga ega bo’lish kerak.
-funktsiyalar qayta yuklanmaydi agar ular parametrlari turi faqat const va & belgisi bilan farq kilsa.
Dostları ilə paylaş: |