Rekursiya
Rekursiya — Funksiya oʻziga oʻzi toʻgʻridan-toʻgʻri yoki qandaydir vosita orqali murojaat qilish jarayoniga rekursiya deyiladi va bunday funksiya rekursiv funksiya deb ataladi[1]. Rekursiv funksiya oʻzini — oʻzi chaqirgani uchun dasturchilar orasida quyi oldin rekursiya nimagligini tushunish kerak“ — Stephen Hawking[2]. Rekursiya funksional dasturlashning asosiy elementlaridan hisoblanadi. Rekursiya deyarli hamma joyda ishlatiladi. Baʼzi masalalarning iterativ yechimi juda ham uzun boʻlib ketishi mumkin. Rekursiya esa kodni bir necha barobar qisqartirib berishi mumkin. Aksariyat tuzilmalar va algoritmlarni rekursiyasiz tasavvur qilib boʻlmaydi. Tree, Graph, Heap, Quick Sort, Merge Sort, … Bu ro'yhatni juda uzoq davom ettirish mumkin. Ayniqsa, murakkab tuzilmalar boʻlgan Tree va Graphlarda rekursiya har qadamda uchraydi.
Kamchiligi
[tahrir | manbasini tahrirlash]- Rekursiya har doim xotiradan qoʻshimcha joy talab qiladi.
- Rekursiv yechimda xato qilish ehtimoli yuqori, chunki rekursiya juda ham chalgʻituvchi.
- Rekursiv yechimni xatosini topish qiyin.
- Murakkab algoritmni hisoblash qiyin.
Algoritmi
[tahrir | manbasini tahrirlash]Qutilar ichma-ich ixtiyoriy joylashtirilgan, qaysidir quti ichida kalit bor. Siz kalitni topish algoritmini tuzishingiz kerak
- Rekursiyaga qoʻyish uchun ushbu ikki shartni yozib olamiz
- Ishlash sharti: Quti ichida ichki quti chiqsa, uni ochib koʻr. Agar ichki qutidan kalit chiqmasa tashqi qutining kelgan joyidan davom et.
- Toʻxtash sharti: Quti ichidan kalit topilsa toʻxta.
Dasturi
[tahrir | manbasini tahrirlash]Fibonachchi ketma ketligining n — hadini rekursiya qism dastur orqali hisoblovchi dastur
#include <iostream.h> int fib(int); int main() { int n; cout << "n="; cin >> n; cout << fib(n) << endl; return 0; } int fib(int k) { if (k == 0 || k == 1) return 1; else return fib(k - 1) + fib(k - 2); }
[3].
- Rekursiyaga oid dastur
#include <bits/stdc++.h> using namespace std; void tower(int n, char sourcePole, char destinationPole, char auxiliaryPole) { if(0 == n) return; tower(n - 1, sourcePole, auxiliaryPole, destinationPole); cout << "Diskni ko'chiring "<< n << " dan " << sourcePole <<" ga "<< destinationPole << endl; tower(n - 1, auxiliaryPole, destinationPole, sourcePole); } int main() { tower(3, 'S', 'D', 'A'); return 0; }
[4].
Rekursiv funksiyaning toʻxtash chegarasi boʻlmasa, amallar cheksiz bajarilaveradi, oqibatda dastur xatolik keltirib chiqaradi.
Manbalar
[tahrir | manbasini tahrirlash]Bu maqola birorta turkumga qoʻshilmagan. Iltimos, maqolaga aloqador turkumlar qoʻshib yordam qiling. (Aprel 2024) |