सी मध्ये पुनरावृत्ती

जेव्हा एखादी फंक्शन एखाद्या छोट्या समस्येवर कार्य करण्यासाठी स्वत: ची प्रत कॉल करते तेव्हा पुनरावृत्ती ही एक प्रक्रिया अस्तित्वात येते. कोणत्याही फंक्शनला ज्याला स्वतः कॉल केले जाते त्याला रिकर्सिव्ह फंक्शन म्हणतात आणि अशा फंक्शन कॉलला रिकर्सिव्ह कॉल म्हणतात. पुनरावृत्तीमध्ये अनेक संख्येच्या रिकर्सिव्ह कॉलचा समावेश आहे. तथापि, पुनरावृत्तीची समाप्ती स्थिती लागू करणे महत्वाचे आहे. पुनरावृत्ती कोड पुनरावृत्ती कोडपेक्षा लहान आहे परंतु हे समजणे कठीण आहे. सर्व समस्येवर पुनरावृत्ती लागू केली जाऊ शकत नाही, परंतु समान सबटास्कच्या दृष्टीने परिभाषित केल्या जाणार्‍या कार्यांसाठी हे अधिक उपयुक्त आहे. उदाहरणार्थ, सॉर्टिंग, शोध आणि ट्रॅव्हर्सल समस्यांवर पुनरावृत्ती लागू केली जाऊ शकते. फंक्शन कॉल नेहमीच ओव्हरहेड असल्याने पुनरावृत्तीपेक्षा पुनरावृत्ती सोल्यूशन्स अधिक कार्यक्षम असतात. कोणतीही समस्या ज्याची पुनरावृत्ती पुनरावृत्ती केली जाऊ शकते, पुनरावृत्ती देखील सोडविली जाऊ शकते. तथापि, पुनरावृत्तीद्वारे काही समस्या सोडविण्यासाठी योग्य आहेत, उदाहरणार्थ, टॉवर ऑफ हनोई, फिबोनॅकी मालिका, फॅक्टोरियल फाइंडिंग इ. खालील उदाहरणात, पुनरावृत्तीचा वापर संख्येच्या फॅक्टोरियलची गणना करण्यासाठी केला जातो.

उदाहरण

#vaapara <PsaTidiAayaAae.Pca>
paunaZ vastausYaitai (paunaZ);
paunaZ mauqya()
{
paunaZ Pna,Ppaf;
laiha("pzavaiST kra D kzmaaMk jyaacyaa taYyaatmak Aapana hvae Aahe Tu gananaa kra?");
vacaa("%paunaZ",&Pna);
Ppaf = vastausYaitai(Pna);
laiha("taYyaatmak = %paunaZ",Ppaf);
}
paunaZ vastausYaitai(paunaZ Pna)
{
jar (Pna==0)
{
vaapasakra 0;
}
nahitar jar ( Pna == 1)
{
vaapasakra 1;
}
nahitar
{
vaapasakra Pna*vastausYaitai(Pna-1);
}
}

आउटपुट

pzavaiSTRkra D kzmaaMk jyaacyaa taYyaatmak Aapana hvaeRAahe Tu gananaaRkra?5
taYyaatmak = 120

रिकर्सिव्ह फंक्शन

रिकर्सिव्ह फंक्शन सबटास्कमध्ये विभागून कार्ये करते. फंक्शनमध्ये परिभाषित केलेली एक समाप्तीची स्थिती आहे जी काही विशिष्ट सबटास्कद्वारे समाधानी आहे. यानंतर, पुनरावृत्ती थांबते आणि अंतिम निकाल फंक्शनमधून परत आला. ज्या प्रकरणात फंक्शन पुन्हा येत नाही त्याला बेस केस म्हणतात तर फंक्शन स्वतःला सबटास्क करण्यासाठी कॉल करत असलेल्या घटनांना रिकर्सिव्ह केस म्हणतात. सर्व रिकर्सिव्ह फंक्शन्स या स्वरूपाचा वापर करून लिहिले जाऊ शकतात. कोणतेही रिकर्सिव्ह फंक्शन लिहिण्यासाठी स्यूडोकोड खाली दिले आहेत.

jar (jmIjRYvtRV.Im)
{
vaapasakra kahiRvhWlyau;
}
nahitar jar (jmIjRYvtR.CjmtRV.Im)
{
vaapasakra kahiRAnarRvhWlyau;
}
nahitar
{
// sTeTmaenT;
rikZisavh kla;
}

सी मध्ये पुनरावृत्तीचे उदाहरण

फिबोनॅकी मालिकेची एनटीएच टर्म शोधण्यासाठी एक उदाहरण पाहूया.

उदाहरण

#vaapara<PsaTidiAayaAae.Pca>
paunaZ pafibaaenaWki(paunaZ);
qaalai mauqya ()
{
paunaZ Pna,Ppaf;
laiha("pzavaiST kra D maulya cyaa n?");
vacaa("%paunaZ",&Pna);
Ppaf = pafibaaenaWki(Pna);
laiha("%paunaZ",Ppaf);
}
paunaZ pafibaaenaWki (paunaZ Pna)
{
jar (Pna==0)
{
vaapasakra 0;
}
nahitar jar (Pna == 1)
{
vaapasakra 1;
}
nahitar
{
vaapasakra pafibaaenaWki(Pna-1)+pafibaaenaWki(Pna-2);
}
}

आउटपुट

pzavaiSTRkra D maulya cyaa Pna?12
144

रिकर्सिव्ह पद्धतीची मेमरी वाटप

प्रत्येक रिकर्सिव्ह कॉल मेमरीमध्ये त्या पद्धतीची एक नवीन प्रत तयार करते. एकदा काही डेटा पद्धतीने परत आला की कॉपी मेमरीमधून काढली जाते. फंक्शनमध्ये घोषित केलेली सर्व व्हेरिएबल्स आणि इतर सामग्री स्टॅकमध्ये संग्रहित होत असल्याने, म्हणून प्रत्येक रिकर्सिव्ह कॉलवर एक वेगळा स्टॅक राखला जातो. एकदा संबंधित फंक्शनमधून मूल्य परत केले की स्टॅक नष्ट होतो. पुनरावृत्तीमध्ये प्रत्येक रिकर्सिव्ह कॉलवर मूल्यांचे निराकरण आणि ट्रॅक करण्यात इतकी गुंतागुंत असते. म्हणून आम्हाला स्टॅकची देखभाल करणे आणि स्टॅकमध्ये परिभाषित केलेल्या व्हेरिएबल्सच्या मूल्यांचा मागोवा घेणे आवश्यक आहे. रिकर्सिव्ह फंक्शन्सचे मेमरी वाटप समजून घेण्यासाठी खालील उदाहरणांचा विचार करूया.

प्रत्येक रिकर्सिव्ह कॉल मेमरीमध्ये त्या पद्धतीची एक नवीन प्रत तयार करते. एकदा काही डेटा पद्धतीने परत आला की कॉपी मेमरीमधून काढली जाते. फंक्शनमध्ये घोषित केलेली सर्व व्हेरिएबल्स आणि इतर सामग्री स्टॅकमध्ये संग्रहित होत असल्याने, म्हणून प्रत्येक रिकर्सिव्ह कॉलवर एक वेगळा स्टॅक राखला जातो. एकदा संबंधित फंक्शनमधून मूल्य परत केले की स्टॅक नष्ट होतो. पुनरावृत्तीमध्ये प्रत्येक रिकर्सिव्ह कॉलवर मूल्यांचे निराकरण आणि ट्रॅक करण्यात इतकी गुंतागुंत असते. म्हणून आम्हाला स्टॅकची देखभाल करणे आणि स्टॅकमध्ये परिभाषित केलेल्या व्हेरिएबल्सच्या मूल्यांचा मागोवा घेणे आवश्यक आहे. रिकर्सिव्ह फंक्शन्सचे मेमरी वाटप समजून घेण्यासाठी खालील उदाहरणांचा विचार करूया.

paunaZ pzaDSaZna (paunaZ Pna)
{
jar(Pna == 0)
vaapasakra 0; // saMpauSTataRAananae AT
nahitar
{
laiha("%paunaZ",Pna);
vaapasakra pzaDSaZna(Pna-1); // rikZisavh kla
}
}

स्पष्टीकरण

◀ मागील पुढील ▶