259
if ((c>=`a`) && (c<=`Z`)) m=1;
if (c==`_`) m=1; }
switch(m)
{ case 0: if (k==0) k=-1;break;
case 1: k=1;beak;
default: k=-1;break; } }
if (k=-1) cout<<(“\n Identifikator emas”); else cout<<(“\n Identifikator”); }
Rekursiv funksiyalar.
Rekursiv funksiya deb, o`ziga o`zi murojaat qiluvchi
funksiyaga aytiladi. Masalan, faktorialni hisoblash funksiyasini keltiramiz:
39-listing.
Output:
Long fact(int k)
{if (k<0) return 0;
if (k==0) return 1;
return k*fact(k-1); }
Manfiy argument uchun funksiya 0 qiymat qaytaradi. Parametr 0
ga teng
bo`lsa funksiya 1 qiymat qaytaradi. Aks holda,
parametr qiymat birga
kamaytirilgan holda funksiyaning o`zi chaqiriladi va uzatilgan parametrga
ko`paytiriladi. Funksiyaning o`z - o`zini chaqirish formal parametr qiymati 0 ga
teng bo`lganda to`xtatiladi. Keyingi misolimizda ixtiyoriy
haqiqiy sonning butun
darajasini hisoblash rekursiv funksiyasini keltiramiz.
40-listing.
Output:
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; }
Funksiyaga expo(2.0,3) shaklda murojaat qilinganda rekursiv ravishda
funksiyaning ikkinchi parametri kamaygan holda murojaatlar hosil bo`ladi:
260
Expo(2.0,3), expo(2.0,2), expo(2.0,1), expo(2.0,0).
Bu
murojaatlarda quyidagi
ko`paytma hisoblanadi:
2.0*2.0*2.0*1
va kerakli natija hosil qilinadi. Shuni
ko`rsatib o`tish kerakki, bu funksiyamizda 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
funksiyalardan foydalanish maqsadga muvofiqdir. Masalan, darajani hisoblash
funksiyani quyidagicha tuzish mumkin:
41-listing.
Output:
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 bo`ladi. Birinchi
usulda raqamlarni
massivda saqlab so`ngra teskari tartibda chiqarishdir.
Rekursiv usulda funksiya har bir chaqiriqda bosh raqamlardan nusxa olish
uchun o`z - o`ziga
murojaat qiladi, so`ngra oxirgi raqamni bosib chiqaradi.
42-listing. print n in decimal (recursive)
Output:
printd(n)
int n;
( int i;
if (n < 0)
putchar(`-`);
n = -n;
if ((i = n/10) != 0)
261
printd(i);
putchar(n % 10 + `0`); )
PRINTD(123)
chaqiriqda birinchi funksiya PRINTD N = 123 qiymatga ega.
U 12 qiymatni ikkinchi PRINTD ga uzatadi, boshqarish o`ziga qaytganda 3 ni
chiqaradi.