रिकर्सिव फंक्शन वह है जो अपने बॉडी में स्वयं को फिर से कॉल करता है।
उदाहरण के लिए, fact() फंक्शन जो पूर्णांक 'N' का फैक्टोरियल गणना करता है, जो 1 से N तक सभी पूर्णांकों का गुणनफल है।
fact()जब 1 (या 0) आर्गुमेंट के साथ कॉल होता है, तो 1 लौटाता है।- अन्यथा, यह
n * fact(n-1)लौटाता है, यह तब तक चलता है जब तक 'n' 1 के बराबर नहीं हो जाता।
Fact(5) = 5 * fact(4)
= 5 * 4 * fact(3)
= 5 * 4 * 3 * fact(2)
= 5 * 4 * 3 * 2 * fact(1)
= 5 * 4 * 3 * 2 * 1
= 120
उदाहरण 1: फैक्टोरियल के लिए रिकर्सिव फंक्शन
#include <stdio.h>
int fact(int n); // प्रोटोटाइप
int main() {
int n, f;
printf("Enter a number: ");
scanf("%d", &n);
f = fact(n);
printf("Factorial value = %d", f);
return 0;
}
int fact(int n) {
if(n == 1 || n == 0)
return 1;
else
return n * fact(n - 1);
}
आउटपुट
Enter a number: 5 Factorial value = 120
उदाहरण 2: रिकर्सन का उपयोग करके संख्या उलटना
#include <stdio.h>
int sum = 0, rem;
int revNumFunction(int num) {
if(num) {
rem = num % 10; // अंतिम अंक प्राप्त करें
sum = sum * 10 + rem; // रिवर्स नंबर बनाएं
revNumFunction(num / 10); // रिकर्सिव कॉल
} else {
return sum;
}
}
int main() {
int num, revNum;
printf("Enter number:\n");
scanf("%d", &num);
revNum = revNumFunction(num);
printf("The number after reverse: %d", revNum);
return 0;
}
आउटपुट
Enter number: 1357 The number after reverse is: 7531
व्याख्या (संख्या उलटने के लिए)
sumऔरremग्लोबल वेरिएबल्स हैं (स्टेट बनाए रखने के लिए)।- प्रत्येक रिकर्सिव कॉल में:
rem = num % 10- अंतिम अंक निकालेंsum = sum * 10 + rem- रिवर्स नंबर बनाएंrevNumFunction(num / 10)- शेष अंकों के साथ रिकर्सन
- बेस केस: जब
num == 0,sumलौटाएं।
बेहतर दृष्टिकोण: ग्लोबल वेरिएबल्स के बिना
int reverseNumber(int num, int rev) {
if(num == 0)
return rev;
return reverseNumber(num / 10, rev * 10 + num % 10);
}
// कॉल: reverseNumber(1357, 0) -> 7531
रिकर्सन के लाभ और हानि
| लाभ | हानि |
|---|---|
| कोड सरल और सुंदर | स्टैक ओवरफ्लो का जोखिम (गहरी रिकर्सन) |
| जटिल समस्याओं के लिए सहज | ओवरहेड: फंक्शन कॉल लागत |
| ट्री/ग्राफ ट्रैवर्सल के लिए प्राकृतिक | डीबग करना कठिन |