सी में पुनरावृत्ति
पुनरावृत्ति वह प्रक्रिया है जो अस्तित्व में आती है जब कोई फ़ंक्शन एक छोटी समस्या पर काम करने के लिए खुद की एक प्रति कहता है। कोई भी फ़ंक्शन जो खुद को कॉल करता है उसे पुनरावर्ती फ़ंक्शन कहा जाता है, और इस तरह के फ़ंक्शन कॉल को पुनरावर्ती कॉल कहा जाता है। पुनरावृत्ति में कई संख्या में पुनरावर्ती कॉल शामिल हैं। हालांकि, पुनरावृत्ति की समाप्ति की स्थिति लागू करना महत्वपूर्ण है। पुनरावृत्ति कोड पुनरावृत्त कोड से कम है, हालांकि इसे समझना मुश्किल है। पुनरावृत्ति को सभी समस्याओं पर लागू नहीं किया जा सकता है, लेकिन यह उन कार्यों के लिए अधिक उपयोगी है जिन्हें समान सबटास्क के संदर्भ में परिभाषित किया जा सकता है। उदाहरण के लिए, पुनरावृत्ति को छँटाई, खोज और ट्रैवर्सल समस्याओं के लिए लागू किया जा सकता है। आम तौर पर, पुनरावृत्ति समाधान पुनरावृत्ति की तुलना में अधिक कुशल होते हैं क्योंकि फ़ंक्शन कॉल हमेशा ओवरहेड होता है। किसी भी समस्या को पुनरावर्ती रूप से हल किया जा सकता है, इसे पुनरावृत्त रूप से भी हल किया जा सकता है। हालांकि, कुछ समस्याएं पुनरावर्ती द्वारा हल किए जाने के लिए सबसे उपयुक्त हैं, उदाहरण के लिए, टॉवर ऑफ हनोई, फाइबोनैचि श्रृंखला, फैक्टरियल फाइंडिंग, आदि। निम्नलिखित उदाहरण में, पुनरावृत्ति का उपयोग एक संख्या के तथ्यात्मक की गणना करने के लिए किया जाता है।
उदाहरण
#EZstamaalakre <PsaTidiAayaAae.Pca>
paunaZ taYya (paunaZ);
paunaZ mauqya()
{
paunaZ Pna,Ppaf;
laiqaiyae("pzavaeSa krnaa saMqyaa kisaka karqaanae ka Aapa caahnaa kae baMsabanasaMjama?");
laijaiyae("%paunaZ",&Pna);
Ppaf = taYya(Pna);
laiqaiyae("karqaanae ka = %paunaZ",Ppaf);
}
paunaZ taYya(paunaZ Pna)
{
Agar (Pna==0)
{
vaapasakre 0;
}
nahitaae Agar ( Pna == 1)
{
vaapasakre 1;
}
nahitaae
{
vaapasakre Pna*taYya(Pna-1);
}
}
आउटपुट
pzavaeSaRkrnaa saMqyaa kisaka karqaanaeRka Aapa caahnaa kae baMsabanasaMjama?5
karqaanaeRka = 120
पुनरावर्ती कार्य
एक पुनरावर्ती फ़ंक्शन इसे सबटास्क में विभाजित करके कार्यों को करता है। फ़ंक्शन में परिभाषित एक समाप्ति की स्थिति है जो कुछ विशिष्ट उप -समूह द्वारा संतुष्ट है। इसके बाद, पुनरावृत्ति बंद हो जाती है और अंतिम परिणाम फ़ंक्शन से वापस आ जाता है। जिस मामले पर फ़ंक्शन की पुनरावृत्ति नहीं होती है, उसे आधार केस कहा जाता है, जबकि ऐसे उदाहरण जहां फ़ंक्शन खुद को सबटास्क करने के लिए कॉल करता रहता है, को पुनरावर्ती मामला कहा जाता है। सभी पुनरावर्ती कार्यों को इस प्रारूप का उपयोग करके लिखा जा सकता है। किसी भी पुनरावर्ती फ़ंक्शन को लिखने के लिए स्यूडोकोड नीचे दिया गया है।
Agar (jamaejaRivataREMema)
{
vaapasakre kuCRAMsanama;
}
nahitaae Agar (jamaejaRivataRMDvajaimataREMema)
{
vaapasakre kuCRMDvajaimataRAMsanama;
}
nahitaae
{
// bayaana;
paunaravataiZ paukarnaa;
}
सी में पुनरावृत्ति का उदाहरण
आइए फाइबोनैचि श्रृंखला के nth शब्द को खोजने के लिए एक उदाहरण देखें।
उदाहरण
#EZstamaalakre<PsaTidiAayaAae.Pca>
paunaZ pafaEbaaenaIcai(paunaZ);
qaalai mauqya ()
{
paunaZ Pna,Ppaf;
laiqaiyae("pzavaeSa krnaa kimata ka n?");
laijaiyae("%paunaZ",&Pna);
Ppaf = pafaEbaaenaIcai(Pna);
laiqaiyae("%paunaZ",Ppaf);
}
paunaZ pafaEbaaenaIcai (paunaZ Pna)
{
Agar (Pna==0)
{
vaapasakre 0;
}
nahitaae Agar (Pna == 1)
{
vaapasakre 1;
}
nahitaae
{
vaapasakre pafaEbaaenaIcai(Pna-1)+pafaEbaaenaIcai(Pna-2);
}
}
आउटपुट
pzavaeSaRkrnaa kimata ka Pna?12
144
पुनरावर्ती विधि का स्मृति आवंटन
प्रत्येक पुनरावर्ती कॉल मेमोरी में उस विधि की एक नई प्रति बनाता है। एक बार जब कुछ डेटा विधि द्वारा वापस कर दिया जाता है, तो कॉपी मेमोरी से हटा दी जाती है। चूंकि फ़ंक्शन के अंदर घोषित सभी चर और अन्य सामान स्टैक में संग्रहीत होते हैं, इसलिए प्रत्येक पुनरावर्ती कॉल पर एक अलग स्टैक बनाए रखा जाता है। एक बार जब मान को संबंधित फ़ंक्शन से वापस कर दिया जाता है, तो स्टैक नष्ट हो जाता है। पुनरावृत्ति में प्रत्येक पुनरावर्ती कॉल पर मूल्यों को हल करने और ट्रैक करने में इतनी जटिलता शामिल है। इसलिए हमें स्टैक को बनाए रखने और स्टैक में परिभाषित चर के मूल्यों को ट्रैक करने की आवश्यकता है। आइए हम पुनरावर्ती कार्यों के स्मृति आवंटन को समझने के लिए निम्नलिखित उदाहरण पर विचार करें।
प्रत्येक पुनरावर्ती कॉल मेमोरी में उस विधि की एक नई प्रति बनाता है। एक बार जब कुछ डेटा विधि द्वारा वापस कर दिया जाता है, तो कॉपी मेमोरी से हटा दी जाती है। चूंकि फ़ंक्शन के अंदर घोषित सभी चर और अन्य सामान स्टैक में संग्रहीत होते हैं, इसलिए प्रत्येक पुनरावर्ती कॉल पर एक अलग स्टैक बनाए रखा जाता है। एक बार जब मान को संबंधित फ़ंक्शन से वापस कर दिया जाता है, तो स्टैक नष्ट हो जाता है। पुनरावृत्ति में प्रत्येक पुनरावर्ती कॉल पर मूल्यों को हल करने और ट्रैक करने में इतनी जटिलता शामिल है। इसलिए हमें स्टैक को बनाए रखने और स्टैक में परिभाषित चर के मूल्यों को ट्रैक करने की आवश्यकता है। आइए हम पुनरावर्ती कार्यों के स्मृति आवंटन को समझने के लिए निम्नलिखित उदाहरण पर विचार करें।
paunaZ pzaDSaZna (paunaZ Pna)
{
Agar(Pna == 0)
vaapasakre 0; // samaapta sYaitai
nahitaae
{
laiqaiyae("%paunaZ",Pna);
vaapasakre pzaDSaZna(Pna-1); // paunaravataiZ paukarnaa
}
}