1 – dars. C++ Dasturlash tilining kelib chiqishi xaqida ma’lumot



Yüklə 0,69 Mb.
səhifə30/121
tarix02.01.2022
ölçüsü0,69 Mb.
#37187
1   ...   26   27   28   29   30   31   32   33   ...   121
aaaaKitob majmuasiiii

23 – DARS. REKURSIYA.

Rekursiv funktsiyalar. Rekursiv funktsiya deb o’ziga uzi murojjat qiluvchi funktsiyaga aytiladi. Misol uchun faktorialni hisoblash funktsiyasini keltiramiz:

Long fact(int k)

{if (k<0) return 0;

if (k==0) return 1;

return k*fact(k-1);

}

Manfiy argument uchun funktsiya 0 qiymat qaytaradi. Parametr 0 ga teng bo’lsa funktsiya 1 qiymat qaytaradi. Aks holda parametr qiymat birga kamaytirilgan holda funktsiyaning o’zi chaqiriladi va uzatilgan parametrga ko’paytiriladi. Funktsiyaning uz uzini chaqirish formal parametr qiymati 0 ga teng bo’lganda tuhtatiladi. Keyingi misolimizda ihtiyoriy haqiqiy sonning butun darajasini hisoblash rekursiv funktsiyasini keltiramiz.



Double expo(double a, int n)

{ if (n==0) return 1;

if (a==0.0) return 0;

if (n>0) return a*expo(a,n-1);

if(n<0) return expo(a,n+1)/a;

}

Misol uchun funktsiyaga expo(2.0,3) shaklda murojaat qilinganda rekursiv ravishda funktsiyaning ikkinchi parametri kamaygan holda murojjatlar hosil buladi:



Expo(2.0,3),expo(2.0,2),expo(2.0,1),expo(2.0,0). Bu murojaatlarda quyidaga kupaytma hisoblanadi: 2.0*2.0*2.0*1 va kerakli natija hosil qilinadi.

Shuni kursatib o’tish kerakki bu funktsiyamizda noaniqlik mavjuddir ya'ni 0.0 ga teng sonning 0 chi darajasi 0 ga teng bo’ladi. Matematik nuqtai nazardan bo’lsa bu holda noaniqlik kelib chiqadi. Yuqoridagi sodda misollarda rekursiyasiz iterativ funktsiyalardan foydalanish maqsadga muvofiqdir.

Masalan darajani hisoblash funktsiyani quyidagicha tuzish mumkin:

Double expo(double a, int n)

{ if (n==0) return 1;

if (a==0.0) return 0;

int k=(n>0)?n:-n;

for(double s=1.0,int i=0;i

if (n>0) return s else return 1/s;

}

Rekursiyaga misol sifatida sonni satr shaklida chiqarish masalasini ko’rib chiqamiz. Son raqamlari teskari tartibda hosil buladi. Birinchi usulda raqamlarni massivda saqlab so’ngra teskari tartibda chiqarishdir.



Rekursiv usulda funktsiya har bir chaqiriqda bosh raqamlardan nusha olsih uchun o’z o’ziga murojaat qiladi, so’ngra ohirgi rakamni bosib chiqaradi.

printd(n) /* print n in decimal (recursive)*/

int n;

(

int i;



if (n < 0)

putchar('-');

n = -n;

if ((i = n/10) != 0)


printd(i);

putchar(n % 10 + '0');

)
PRINTD(123) chaqiriqda birinchi funktsiya PRINTD N = 123 qiymatga ega. U 12 qiymatni ikkinchi PRINTD ga uzatadi, boshqarish o’ziga qaytganda 3 ni chiqaradi.


Yüklə 0,69 Mb.

Dostları ilə paylaş:
1   ...   26   27   28   29   30   31   32   33   ...   121




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin