Recursiv funksiya quyidagi parametrlarni o'z ichiga oladi:
qayta ishlanayotgan s satri string tipida;
rekursiyadagi joriy holat uchun belgining s satrdagi o`rnini aniqlovchi o`zgaruvchi. s[pos] chartipidagi belgi;
k butun soni, bu rekursiyada s[pos] belgisining takrorlanish sonini aniqlaydi;
c char tipidagi o'zgaruvchi, rekursiv funksiyada oldingi belgini ifodalaydi. Bu ketma-ket topilgan belgilarni maxsus qayta ishlash uchun kerak.
// ratrni qayta ishlash uchun rekursiv funksiya
static string ConvertStr(string s, int pos, char c, int k, string s2)
{
if (pos < s.Length) // s[pos] hozircha s[pos] oxirgi belgi emas
{
if (pos == 0) // satrning birinchi belgisi
// keyingi belgini qayta ishlashga o'tish
return ConvertStr(s, pos + 1, s[pos], 1, s2);
else // не первый символ строки
{
if (s[pos] == c) // agar keyingi va oldingi belgilar bir xil bo'lsa, biz harakat davom ettiramiz
return ConvertStr(s, pos + 1, s[pos], k + 1, s2);
else // agar belgilar har xil bo'lsa, unda s2 satrida vaqtinchalik natijani belgilash
{
// agar k = = 1 bo'lsa, s2 ga c belgisi shunchaki qo`shish,
// aks holda, c belgisidan oldin k raqamini qo'yish
if (k == 1)
s2 = s2 + c.ToString();
else
s2 = s2 + k.ToString() + c.ToString(); // s2 = s2 + "AAA' = s2 + "3A"
// rekursiyaning keyingi qadamiga o'tish, satrni qayta ishlashni davom ettirish
return ConvertStr(s, pos + 1, s[pos], 1, s2);
}
}
}
else // butun satr o`tish
{
// satrni qayta ishlashni tugatish
if (k == 1)
s2 = s2 + c.ToString();
else
s2 = s2 + k.ToString() + c.ToString();
return s2; // rekursiv jarayonning oxiri
}
Do'stlaringiz bilan baham: |