समस्या
किसी नाम को 10 बार प्रिंट करना बिना किसी लूप (for/while/do-while) या goto के।
विधि 1: पुनरावर्तन (Recursion)
#include <stdio.h>
void printName(char *name, int count) {
printf("%03d: %s\n", count + 1, name);
if (count < 9) // बेस केस: 0 से 9 तक = 10 बार
printName(name, count + 1);
}
int main() {
char name[50];
printf("नाम दर्ज करें: ");
scanf("%49s", name);
printName(name, 0);
return 0;
}
आउटपुट
नाम दर्ज करें: TutorialsPoint 001: TutorialsPoint 002: TutorialsPoint ... 010: TutorialsPoint
विधि 2: स्टैंडर्ड लाइब्रेरी फंक्शन्स
// memset + write (POSIX)
#include <string.h>
#include <unistd.h>
int main() {
char buf[100];
sprintf(buf, "Hello\n");
// 10 बार लिखें - लेकिन यह लूप के बिना नहीं हो सकता
}
विधि 3: कंपाइल-टाइम अनरोलिंग (मैक्रोज़)
#define PRINT10(name) \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name); \
printf("%s\n", name)
int main() {
PRINT10("TutorialsPoint");
return 0;
}
विधि 4: सरणी और कॉलबैक (अप्रत्यक्ष)
void printer(char *s) { printf("%s\n", s); }
int main() {
void (*funcs[10])(char*) = {printer}; // केवल पहला भरा
// फिर भी लूप चाहिए सभी 10 कॉल करने के लिए
}
विधि 5: setjmp/longjmp (नहीं अनुशंसित)
गोटो-जैसा, जटिल, त्रुटि-प्रवण।
तुलना
| विधि | पक्ष | विपक्ष | व्यावहारिक? |
|---|---|---|---|
| पुनरावर्तन | साफ, स्केलेबल | स्टैक ओवरफ्लो (बड़े n), ओवरहेड | छोटे n के लिए हाँ |
| मैक्रोज़ | कोई रनटाइम ओवरहेड नहीं | कोड ब्लोट, लचीला नहीं | नहीं (केवल निश्चित n) |
| लूप | सरल, कुशल, मानक | प्रतिबंध के विरुद्ध | हाँ (सामान्य) |
पुनरावर्तन की सीमाएं
- स्टैक आकार सीमित (आमतौर पर 1-8 MB)
- गहरी पुनरावर्तन → स्टैक ओवरफ्लो
- टेल कॉल ऑप्टिमाइजेशन (TCO) C में गारंटीड नहीं
- प्रत्येक कॉल: रिटर्न पता, स्थानीय चर, रजिस्टर्स सेव
निष्कर्ष
व्यावहारिक प्रोग्रामिंग में लूप का उपयोग करें। यह अभ्यास केवल नियंत्रण प्रवाह समझने के लिए है। पुनरावर्तन उन समस्याओं के लिए उपयुक्त है जो स्वाभाविक रूप से पुनरावर्ती हैं (ट्री ट्रैवर्सल, डिवाइड-एंड-कॉन्कर), सरल पुनरावृत्ति के लिए नहीं।