|
using System;
class Factorial
{
// Rekursiv metod.
public int FactR
|
bet | 84/154 | Sana | 08.01.2024 | Hajmi | 5,29 Mb. | | #131939 |
Bog'liq Majmuausing System;
class Factorial
{
// Rekursiv metod.
public int FactR(int n)
{
int result;
if (n == 0 || n == 1 ) return 1;
result = FactR(n - 1) * n;
return result;
}
// Iteratsion metod.
public int FactSikl(int n)
{
int t, result;
result = 1;
for (t = 1; t <= n; t++)
result *= t;
return result;
}
}
using System;
namespace rekursiya
{
class Program
{
public static void Main(string[] args)
{
Factorial f = new Factorial();
Console.WriteLine("Rekursiv usul bilan hisoblangan faktoriallar");
Console.WriteLine("3 ning faktoriali " + f.FactR (3));
Console.WriteLine("4 ning faktoriali " + f.FactR (4));
Console.WriteLine("5 ning faktoriali " + f.FactR (5));
Console.WriteLine();
Console.WriteLine("Iteratsiya bilan hisoblangan faktoriallar");
Console.WriteLine("3 ning faktoriali " + f.FactSikl(3));
Console.WriteLine("4 ning faktoriali " + f.FactSikl(4));
Console.WriteLine("5 ning faktoriali " + f.FactSikl(5));
Console.ReadKey(true);
}
}
}
Ushbu dastur bajarilganda quyidagi natija olinadi
Rekursiv usul bilan hisoblangan faktoriallar
3 ning faktoriali 6
4 ning faktoriali 24
5 ning faktoriali 120
Sikl bilan hisoblangan faktoriallar
3 ning faktoriali 6
4 ning faktoriali 24
5 ning faktoriali 120
Rekursiv bo‘lmagan FactSikl() metodining ishlash prinsipi juda aniq. U 1 dan boshlanadigan raqamlar ketma-ket bir-biriga ko‘paytirilib, asta-sekin faktorial beradigan natijani hosil qiladigan sikldan foydalanadi.
Agar FaktR() metodiga n>0 qiymat berilsa, quyidagi holat ro‘y beradi: shart operatorining else bo‘limidagi qiymati(n qiymati) stekda eslab qolinadi. Hozircha qiymati noma’lum n-1 faktorialni hisoblash uchun shu metodning o‘zi n-1 qiymati bilan bilan chaqiriladi. O‘z navbatida, bu qiymat ham eslab qolinadi (stekka joylanadi) va yana metod chaqiriladi va hakoza. Metod n=0 qiymat bilan chaqirilganda if operatorining sharti (n==1) rost bo‘ladi va «return 1;» amali bajarilib, ayni shu chaqirish bo‘yicha 1 qiymati qaytariladi. Shundan keyin «teskari» jarayon boshlanadi - stekda saqlangan qiymatlar ketma-ket olinadi va ko‘paytiriladi: oxirgi qiymat - aniqlangandan keyin (1), u undan oldingi saqlangan qiymatga 1 qiymatiga ko‘paytirib FactR(1) qiymati hisoblanadi, bu qiymat 2 qiymatiga ko‘paytirish bilan FactR(2) topiladi va hokaza. Jarayon FactR(n) qiymatini hisoblashgacha «ko‘tarilib» boradi. Bu jarayonni, n=3 uchun faktorial hisoblash sxemasini 5.3.1-rasmda ko‘rish mumkin:
↓
|
FactR(3) = 3*FactR(2)
|
↓
|
FactR(3) = 3*FactR(2)
|
↓
|
FactR(3) = 3*FactR(2)
|
↑
|
FactR(3) = 3*FactR(2)
|
↓
|
FactR(2) = 2*FactR(1)
|
↓
|
FactR(2) = 2*FactR(1)
|
↑
|
FactR(2) = 2*FactR(1)
|
|
|
↓
|
FactR(1) = 1*FactR(0)
|
↑
|
FactR(1) = 1*FactR(0)
|
|
|
|
|
↑
|
FactR(0) = 1
|
|
|
|
|
|
|
5.3.1-rasm. 3! ni hisoblash sxemasi
Rekursiv metodlarni to‘g‘ri ishlashi uchun rekursiv chaqirishlarning to‘xtash sharti bo‘lishi kerak. Aks holda rekursiya to‘xtamasligi va o‘z navbatida metod ishi tugamasligi mumkin. Faktorial hisoblashida rekursiv tushishlarning to‘xtash sharti metod parametri n=0 bo‘lishidir (shart operatorining rost shoxi).
Har bir rekursiv murojaat qo‘shimcha xotira talab qiladi - metodlarning lokal obyektlari (o‘zgaruvchilari) uchun har bir murojaatda stekdan yangidan joy ajratiladi. Masalan, rekursiv metodga 100 marta murojaat bo‘lsa, jami 100 lokal obyektlarning majmuasi uchun joy ajratiladi. Ayrim hollarda, ya’ni rekursiyalar soni yetarlicha katta bo‘lganda, stek o‘lchami cheklanganligi sababli (real rejimda 64Kb o‘lchamgacha) u to‘lib ketishi mumkin. Bu holatda programma o‘z ishini «Stek to‘lib ketdi» xabari bilan to‘xtadi.
Metod o‘zini chaqirganda, xotira yangi lokal o‘zgaruvchilar va parametrlar uchun tizim stekiga ajratiladi va metod kod boshidan bu yangi o‘zgaruvchilar va parametrlar bilan bajariladi. Metod rekursiv chaqirilganda uning yangi nusxasi yaratilmaydi, faqat uning yangi argumentlaridan foydalaniladi. Har bir rekursiv murojaatdan qaytgandan so‘ng eski lokal o‘zgaruvchilar va parametrlar stekdan chiqariladi va bajarilish metodda chaqiruv nuqtasidan davom etadi. Rekursiv metodlarni prinsipial jihatdan asta-sekin siqilib, keyin to‘g‘rilanadigan kamon bilan solishtirish mumkin.
Quyida belgilar satrini teskari tartibda chiqarish uchun rekursiyaning yana bir misoli keltirilgan. Ushbu satr rekursiv DisplayRev() metodiga argument sifatida berilgan.
// Rekursiya yordamida belgilar qatorini teskari tartibda chiqarish.
|
| |