title: Leksik analiz - Информатика
text: 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.