Ниже приведен еще один пример рекурсии для вывода символьной строки в обратном порядке. 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.
Do'stlaringiz bilan baham: |