C rekursiya


ULASHISH

Rekursiya

Rekursiya — funksiyaning o‘zini o‘zi chaqirish usuli. Bu usul murakkab masalalarni hal qilish osonroq bo‘lgan oddiy masalalarga ajratish imkonini beradi.

Rekursiyani tushunish biroz qiyin bo‘lishi mumkin. Uning qanday ishlashini anglashning eng yaxshi yo‘li — u bilan tajriba o‘tkazish.


Rekursiya misoli

Ikki sonni qo‘shish oson, ammo sonlar oralig‘ini qo‘shish murakkabroq. Quyidagi misolda sonlar oralig‘ini qo‘shish uchun rekursiyadan foydalaniladi: vazifa ikki sonni qo‘shishdan iborat oddiy amalga ajratiladi:

Misol

1 dan 10 gacha bo‘lgan barcha sonlarni qo‘shish uchun rekursiyadan foydalaning:

int sum(int k);

int main() {
  int result = sum(10);
  printf("%d", result);
  return 0;
}

int sum(int k) {
  if (k > 0) {
    return k + sum(k - 1);
  } else {
    return 0;
  }
}

O‘zingiz sinab ko‘ring »

Misol izohi

sum() funksiyasi chaqirilganda, u k parametrini k qiymatidan kichik barcha sonlar yig‘indisiga qo‘shadi va natijani qaytaradi. k 0 ga teng bo‘lganda funksiya shunchaki 0 qaytaradi. Dastur ishga tushganda quyidagi qadamlarni bajaradi:

10 + sum(9)
10 + ( 9 + sum(8) )
10 + ( 9 + ( 8 + sum(7) ) )
...
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + sum(0)
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0

k 0 ga teng bo‘lganda funksiya o‘zini chaqirmagani uchun dastur shu yerda to‘xtaydi va natijani qaytaradi.

Dasturchi rekursiya bilan juda ehtiyotkor bo‘lishi kerak, chunki hech qachon tugamaydigan yoki haddan tashqari ko‘p xotira yoxud protsessor quvvatini sarflaydigan funksiyani yozib qo‘yish juda oson. Biroq to‘g‘ri yozilganda rekursiya dasturlashda juda samarali va matematik jihatdan nafis yondashuv bo‘lishi mumkin.



Misol

5 dan boshlab teskari sanash uchun rekursiyadan foydalaning:

void countdown(int n);

int main() {
  countdown(5);
  return 0;
}

void countdown(int n) {
  if (n > 0) {
    printf("%d ", n);
    countdown(n - 1);
  }
}

O‘zingiz sinab ko‘ring »

Funksiya n qiymati 0 bo‘lguncha o‘zini n - 1 argumenti bilan chaqiradi.


Rekursiya yordamida faktorialni hisoblash

Bu misolda 5 ning faktorialini hisoblash uchun rekursiv funksiyadan foydalaniladi:

Misol

int factorial(int n);

int main() {
  printf("Factorial of 5 is %d", factorial(5));
  return 0;
}

int factorial(int n) {
  if (n > 1) {
    return n * factorial(n - 1);
  } else {
    return 1;
  }
}

O‘zingiz sinab ko‘ring »

Faktorial — sonni undan kichik barcha sonlarga, 1 gacha ko‘paytirish demakdir. Masalan, 5 ning faktoriali: 5 * 4 * 3 * 2 * 1 = 120. Ta’rifga ko‘ra, 0! ham 1 ga teng.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!