Информатика
Download 7.16 Mb. Pdf ko'rish
|
informatika Mominov
- Bu sahifa navigatsiya:
- Rekursiv funksiyalar.
Leksik analiz. Kiritilgan ifoda haqiqiy sonligini tekshiruvchi dastur:
33-listing. Output: #include void Main() { int k=1; m=0; char c; while (c!=`\n`) { if ((c=`.`) && (m=0)) {m=1; continue }; if ((c<`0`) || (c>`9`)) {k=0; break}; } if (k) cout<<“\n Haqiqiy son”; else cout<<“\n Haqiqiy son emas”;} Keyingi dasturimizda kiritilayotgan ifoda identifikator yoki yo`qligi tekshiriladi: 34-listing. Output: #include void Main() { int k=0; char c; while (c!=`\n`) {if (k==-1) break; m=2; if ((c>=`0`) && (c<=`9`)) m=0; 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 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. Download 7.16 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling