1-Mavzu 1-Mavzu Reja: Klass a’zolariga ruxsatni boshqarish


// Rekursiyaga oddiy misol


Download 116.94 Kb.
bet41/100
Sana02.01.2022
Hajmi116.94 Kb.
#200801
1   ...   37   38   39   40   41   42   43   44   ...   100
Bog'liq
dasturiy injinering

// Rekursiyaga oddiy misol.

using System;

class Factorial {

// Bu rekursiv metod hisoblanadi.

public int FactR(int n) {

int result;

if(n==l) return 1;

result = FactR(n-l) * n;

return result;

}

// Bu iteratsiya metodi.

public int Factl(int n) {

int t, result;

result = 1;

for(t=l; t <= n; t++) result *= t;

return result;

}

}

class Recursion {

static void Main() {

Factorial f = new Factorial();

Console.WriteLine("Факториалы, рассчитанные рекурсивным методом.");

Console.WriteLine("Факториал числа 3 равен " + f.FactR(3));

Console.WriteLine("Факториал числа 4 равен " + f.FactR(4));

Console.WriteLine("Факториал числа 5 равен " + f.FactR(5));

Console.WriteLine();

Console.WriteLine("Факториалы, рассчитанные итерационным методом.");

Console.WriteLine("Факториал числа 3 равен " + f.FactR(3));

Console.WriteLine("Факториал числа 4 равен " + f.FactR(4)) ;

Console.WriteLine("Факториал числа 5 равен " + f.FactR(5));

}

}

Ushbu dastur bajarilganda quyidagi natijalar olinadi.

Факториалы, рассчитанные рекурсивным методом.

Факториал числа 3 равен 6

Факториал числа 4 равен 24

Факториал числа 5 равен 120

Факториалы, рассчитанные итерационным методом.

Факториал числа 3 равен 6

Факториал числа 4 равен 24

Факториал числа 5 равен 120

Facti() ning rekursiv bo'lmagan metodning ishlash printsipi juda aniq. 1 dan boshlab sonlarni ketma-ket bir-biriga ko'paytirilib, faktorial hosil qiluvchi jarayon siklni ishlatadi.

Recursiv metodda FactR() yanada murakkab tamoyilga amal qilinadi. Agar FactR() metod 1 argument bilan chaqirilsa, u 1 qiymatini qaytaradi. Aks holda, u factr(n-1)*n ko`paytmani qaytaradi. Ushbu ko`paytmani hisoblash uchun FactR() n-1 argument bilan chaqiriladi. Bu jarayon argument qiymati 1ga teng bo'lgunga qadar takrorlanadi, undan keyin olingan qiymatlar ushbu metodning oldingi chaqiruvlariga qaytadi. Misol uchun2 raqamining faktoriyalini hisoblashda birinchi chaqirilganda FactR() metodi ikkinchi chaqiruvi 1 argumenti bilan ko`paytiriladi. Ushbu chaqiruvda 1 qiymati qaytariladi, keyin 2 (argumentning asl qiymati n) bilan ko'paytiriladi. Natijada 2 raqamining faktoriyali (1*2) teng bo'lgan 2 natija qaytariladi. FactR() metodini har bir chaqirishda rekursiya darajasini aniq ko'rsatish uchun WriteLine()operatorni o'z ichiga olgan, shuningdek, ma'lum bir sonning faktoriyalini hisoblashning oraliq natijalarini ko`rish qiziq bo'ladi.

Metod o'zini-o'zi chaqirganda tizim yangi mahalliy o'zgaruvchilar va parametrlar uchun xotirani taqsimlaydi va metodning kodi ushbu yangi o'zgaruvchilar va parametrlar bilan boshidanoq bajariladi. Metodning rekursiv chaqiruvi bilan uning yangi nusxasi yaratilmaydi, faqat uning yangi argumentlari ishlatiladi. Har bir rekursiv chaqiruvdan keyin eski lokal o'zgaruvchilar va parametrlar to'plamdan chiqariladi va metodni bajarishdagi chaqiruv nuqtasi yangilanadi. Rekursiv metodlarini asta-sekin siqilgan va keyin o`z holiga qaytgan prujina harakat qilish printsipi bilan taqqosh mumkin. Quyida satrni teskari tartibda chiqarish uchun rekursiyaga yana bir misoli keltirilgan.

Ниже приведен еще один пример рекурсии для вывода символьной строки в обратном порядке. Bu recursiv DisplayRev() metodiga satr argument sifatida belgilangan.

// Belgilar satrini teskari tartibda chiqarish.

using System;

class RevStr {

// Belgilar satrini teskari tartibda chiqarish.

public void DisplayRev(string str) {

if (str.Length > 0)

DisplayRev(str.Substring(1, str.Length-1));

else

return;

Console.Write(str[0]);

}

}

class RevStrDemo {

static void Main() {

string s = "Это тест"; ,

RevStr rsOb = new RevStr();

Console.WriteLine("Исходная строка: " + s);

Console.Write("Перевернутая строка: ");

rsOb.DisplayRev(s);

Console.WriteLine() ;

}

}

Bu kodning bajarilishi quyidagi natijaga olib keladi.

Исходная строка: Это тест

Перевернутая строка: тсет отЭ

DisplayRev() metodi chaqirilganda str argumenti tomonidan uzatilgan belgilar satrining uzunligini tekshiradi. Agar satrning uzunligi nolga teng bo'lmasa, DisplayRev() metodi yangi boshlang`ich satrdan bitta kam belgili satr bilan rekursiv chaqiriladi. Ushbu metod satr nol uzunlikka yetgunga qadar bu jarayon takrorlanadi. Shundan so'ng, DisplayRev() metodining barcha rekursiv chaqiruv mexanizmlari teskarisiga aylana boshlaydi. Har bir bunday chaqiruvdan qaytgan str argumenti bilan ifodalangan satrning birinchi belgisi ko'rsatiladi va natijada butun satr teskari tartibda ko'rsatiladi.

Ko'pgina protseduralarning rekursiv variantlari ularning iteratsion ekvivalentlariga nisbatan bir oz sekinroq amalga oshirilishi mumkin, chunki tizim resurslarining qo'shimcha chaqiruvlariga vaqt sarflashi bilan bog`liq bo`lishi mumkin. Agar bunday chaqiruvlar juda ko'p bo'lsa, oxir-oqibatda tizim to'plami to'lishi mumkin. Recursiv metodning parametrlari va lokal o'zgaruvchilari tizim stackida saqlanganligi va ushbu metodning har bir yangi chaqiruvi bilan ularning yangi nusxasi yaratilganligi sababli qandaydir bir vaqtda Stack to'lib qolishi mumkin. Bunday holda, istisno holat yuzaga keladi va umumiy tillarda bajaruvchi muhit (CLR) tegishli istisno hosil qiladi. Ammo bu faqat rekursiv protsedura noto'g'ri bajarilgan taqdirda yuzaga kelishi bo'ladi.

Rekursiyaning asosiy afzalligi shundaki, u ba'zi algoritmlarni iterativ usuldan ko'ra aniqroq va osonroq amalga oshirish imkonini beradi. Misol uchun, tez tartiblash algoritmi iterativ usulda amalga oshirish juda qiyin. Sun'iy intelekt kabi ba'zi vazifalar, albatta, recursiv yechimni talab qiladi.

Recursiv metodlarni tegishli joyda shartli operatorni, masalan, if operatorini rekursiv metoddan chiqishni tashkil qilish qilishda yozish kerak. Aks holda, bir marta chaqirilagan recursiv metod hech qachon orqaga qaytmasligi mumkin. Bunday xatolik amaliyotda rekursiyani amalga oshirish jarayoni uchun juda xosdir. Bunday holda, WriteLine() metodidan chaqiruvlarini o'z ichiga olgan operatorlarda  sodir bo'layotgan voqealarni kuzatib borish va agar xato aniqlansa, uning bajarilishini to'xtatish uchun foydalanish tavsiya etiladi.

Download 116.94 Kb.

Do'stlaringiz bilan baham:
1   ...   37   38   39   40   41   42   43   44   ...   100




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling