Funksiya o'zini to'g'ridan -to'g'ri yoki bilvosita chaqirish jarayonini rekursiya, unga mos funksiyani esa rekursiv funksiya deb atashadi. Rekursiv algoritmdan foydalanib, ba'zi muammolarni juda oson hal qilish mumkin.
Bunga Xanoy minoralari (TOH), Inorder/Preorder/Postorder Traversals, DFS of Graph va boshqalar misol bo'la oladi.
Matematik talqini
Dasturchi birinchi n natural sonlarning yig'indisini aniqlashi kerak bo'lgan muammoni ko'rib chiqaylik, buning bir necha yo'li bor, lekin eng oddiy yondashuv 1 dan n gacha bo'lgan sonlarni qo'shishdir.
Shunday qilib, funksiya shunchaki shunday ko'rinadi:
f(n)=1+2+3+……..+n
Lekin buni ifodalashning boshqa matematik yondashuvi bor,
f(n)=1n=1f(n)=n+f(n−1)n>1
Yondashuv (#1) va yondashuv (#2) o'rtasida oddiy farq bor va bu (2) yondashuvda "f ()" funksiyasining o'zi funksiya ichida chaqiriladi, shuning uchun bu hodisa rekursiya va o'z ichiga olgan funksiya deb nomlanadi. Rekursiya rekursiv funksiya deb ataladi, natijada bu dasturchilar qo'lida ba'zi muammolarni ancha oson va samarali kodlash uchun ajoyib vosita.
Rekursiyada asosiy shart nima?
Rekursiv dasturda asosiy holatning yechimi taqdim etiladi va katta masalaning yechimi kichikroq masalalar bilan ifodalanadi.
intfact(int n){if (n <=1) // asosiy holatreturn1;elsereturn n*fact(n-1); }
Yuqoridagi misolda, n <= 1 uchun asosiy holat aniqlangan va sonning kattaroq qiymatini kichik songa aylantirish orqali hal qilish mumkin.
Muayyan muammo rekursiya yordamida qanday hal qilinadi?
Maqsad bitta yoki bir nechta kichikroq muammolarni ifodalash va rekursiyani to'xtatuvchi bir yoki bir nechta asosiy shartlarni qo'shishdan iborat. Masalan, agar biz (n-1) faktorialini bilsak, faktorial n ni hisoblaymiz. Faktorial uchun asosiy holat n = 0 bo'ladi. N = 0 bo'lganda 1 qaytaramiz.
Nima uchun Stack Overflow xatosi rekursiyada paydo bo'ladi?
Agar asosiy holatga erishilmagan yoki aniqlanmagan bo'lsa, unda Stack Overflow ( ma'lumotlar to'plamini ko'payib ketishi) muammosi paydo bo'lishi mumkin. Buni tushunish uchun misol keltiraylik.
intfact(int n){ // noto'g'ri holat (bu stack overflow ga olib kelishi mumkin).if (n ==100) return1;elsereturn n*fact(n-1);}
Agar fakt (10) chaqirilsa, u fakt (9), fakt (8), fakt (7) va boshqalarni chaqiradi, lekin bu raqam hech qachon 100ga etmaydi. Demak, asosiy holatga erishilmagan. Agar xotira bu funksiyalar tufayli to'plamda tugagan bo'lsa, bu to'plamni to'ldirish xatosiga olib keladi.
To'g'ridan - to'g'ri va bilvosita rekursiya o'rtasidagi farq nima?
Funksiya bir xil fun funksiyani chaqirsa, to'g'ridan - to'g'ri rekursiv deb ataladi.
// To'g'ridan -to'g'ri rekursiyaga misolvoiddirectRecFun(){ // Ba'zi kod....directRecFun(); // Ba'zi kod...}// Bilvosita rekursiyaga misolvoidindirectRecFun1(){ // Ba'zi kod...indirectRecFun2(); // Ba'zi kod...}voidindirectRecFun2(){ // Ba'zi kod...indirectRecFun1(); // Ba'zi kod...}
Quyruqli va dumsiz rekursiya o'rtasidagi farq nima?
Rekursiv funksiya quyruqli rekursivdir, agar rekursiv chaqiruv funksiya tomonidan bajariladigan oxirgi narsa bo'lsa. Tafsilotlar uchun quyruq rekursiyasi haqidagi maqolaga qarang.
Rekursiyada turli xil funksional qo'ng'iroqlar uchun xotira qanday ajratiladi?
Main ( ) dan biron - bir funksiya chaqirilganda, xotira unga to'plamda ajratiladi. Rekursiv funksiya o'zini - o'zi chaqiradi, chaqirilgan funksiyani xotirasi chaqiruv funksiyasiga ajratilgan xotira ustiga ajratiladi va har bir funksiya chaqiruvi uchun mahalliy o'zgaruvchilarning turli nusxalari yaratiladi.
Asosiy holatga kelganda, funksiya o'z qiymatini o'zi chaqirgan funksiyaga qaytaradi va xotira ajratilmaydi va jarayon davom etadi. Keling, oddiy funksiyadan foydalanib, rekursiya qanday ishlashini olaylik.
// A C++ program to demonstrate working of// recursion#include<bits/stdc++.h>usingnamespace std;voidprintFun(int test){if (test <1)return;else { cout << test <<" ";printFun(test -1); // statement 2 cout << test <<" ";return; }}// Driver Codeintmain(){int test =3;printFun(test);}
// A Java program to demonstrate working of// recursionclassGFG {staticvoidprintFun(int test) {if (test <1)return;else {System.out.printf("%d ", test);printFun(test -1); // statement 2System.out.printf("%d ", test);return; } }// Driver Codepublicstaticvoidmain(String[] args) {int test =3;printFun(test); }}// This code is contributed by// Smitha Dinesh Semwal
# A Python 3 program to# demonstrate working of# recursiondefprintFun(test):if (test <1):returnelse:print(test, end=" ")printFun(test-1)# statement 2print(test, end=" ")return# Driver Codetest =3printFun(test)# This code is contributed by# Smitha Dinesh Semwal
// A C# program to demonstrate// working of recursionusingSystem;classGFG { // function to demonstrate // working of recursionstaticvoidprintFun(int test) {if (test <1)return;else {Console.Write(test +" "); // statement 2printFun(test -1);Console.Write(test +" ");return; } } // Driver CodepublicstaticvoidMain(String[] args) {int test =3;printFun(test); }}// This code is contributed by Anshul Aggarwal.
<?php// PHP program to demonstrate// working of recursion// function to demonstrate// working of recursionfunctionprintFun($test){if ($test <1)return;else {echo("$test ");// statement 2printFun($test-1);echo("$test ");return; }}// Driver Code$test =3;printFun($test);// This code is contributed by// Smitha Dinesh Semwal.?>
<script>// JavaScript program to demonstrate working of// recursionfunction printFun(test) {if (test <1) return; else { document.write(test + " "); printFun(test - 1); // statement 2 document.write(test + " "); return; } }// Driver code let test = 3; printFun(test);</script>