पुनरावृत्ति या छोरों


123

मैं कुछ विकास साक्षात्कार प्रथाओं के बारे में पढ़ रहा था, विशेष रूप से साक्षात्कार में पूछे गए तकनीकी प्रश्नों और परीक्षणों के बारे में और मैंने शैली के कहने पर बहुत बार ठोकर खाई है "ठीक है आपने थोड़ी देर के लूप के साथ समस्या हल कर ली है, अब आप इसके साथ कर सकते हैं पुनरावृत्ति ", या" हर कोई इसे लूप करते हुए 100 लाइनों के साथ हल कर सकता है, लेकिन क्या वे इसे 5 लाइनों के पुनरावृत्ति कार्य में कर सकते हैं? " आदि।

मेरा प्रश्न है, क्या निर्माण के लिए / जबकि / की तुलना में पुनरावृत्ति आम तौर पर बेहतर है?

मैंने ईमानदारी से हमेशा सोचा है कि पुनरावृत्ति को प्राथमिकता नहीं दी जानी चाहिए, क्योंकि यह स्टैक मेमोरी तक सीमित है जो कि ढेर से काफी छोटा है, एक बड़ी संख्या में फ़ंक्शन / विधि कॉल करने से एक प्रदर्शन दृष्टिकोण से उप-समरूप है, लेकिन मैं हो सकता है गलत हो...



73
पुनरावृत्ति के विषय पर, यह काफी दिलचस्प लग रहा है।
dan_waterworth

4
@dan_waterworth भी, यह मदद करेगा: google.fr/… लेकिन मैं हमेशा इसे याद करने के लिए लगता है: P
शिवान ड्रैगन

@ शिवनद्रगान मैंने सोचा कि ^ _ ^ बहुत उपयुक्त है कि मैंने इसे कल पोस्ट किया है :-)
नील

2
मैंने जिन वातावरण में पुनरावृत्ति में काम किया है, वे सबसे अच्छे रूप में डूबे हुए हैं और आपको सार्वजनिक रूप से सबसे बुरे तरीके से मिलते हैं। प्रभाव में सीमित स्टैक स्थान इसे अवैध बनाता है।
फ्रेड थॉमसन

जवाबों:


192

पुनरावृत्ति छोरों की तुलना में आंतरिक रूप से बेहतर या बदतर नहीं है - प्रत्येक के फायदे और नुकसान हैं, और वे भी प्रोग्रामिंग भाषा (और कार्यान्वयन) पर निर्भर करते हैं।

तकनीकी रूप से, पुनरावृत्त लूप्स सामान्य कंप्यूटर सिस्टम को हार्डवेयर स्तर पर बेहतर तरीके से फिट करते हैं: मशीन कोड स्तर पर, एक लूप सिर्फ एक परीक्षण और एक सशर्त कूद है, जबकि पुनरावृत्ति (भोलेपन से लागू) में एक स्टैक फ्रेम को धक्का देना, कूदना, वापस आना और वापस पॉपिंग शामिल है। ढेर से। OTOH, पुनरावृत्ति के कई मामले (विशेष रूप से वे जो तुच्छ रूप से चलने वाले छोरों के बराबर हैं) लिखे जा सकते हैं ताकि स्टैक पुश / पॉप से ​​बचा जा सके; यह तब संभव है जब पुनरावर्ती फ़ंक्शन कॉल अंतिम चीज़ है जो वापस लौटने से पहले फ़ंक्शन बॉडी में होती है, और इसे आमतौर पर टेल कॉल ऑप्टिमाइज़ेशन (या टेल रिकर्सन ऑप्टिमाइज़ेशन ) के रूप में जाना जाता है । एक ठीक से पूंछ-कॉल-अनुकूलित पुनरावर्ती फ़ंक्शन मशीन कोड स्तर पर पुनरावृत्त लूप के बराबर है।

एक और विचार यह है कि पुनरावृत्त छोरों को विनाशकारी राज्य अपडेट की आवश्यकता होती है, जो उन्हें शुद्ध (पक्ष-प्रभाव मुक्त) भाषा के शब्दार्थ के साथ असंगत बना देती है। यही कारण है कि हास्केल जैसी शुद्ध भाषाओं में लूप कंस्ट्रक्शन बिल्कुल नहीं होते हैं, और कई अन्य कार्यात्मक-प्रोग्रामिंग भाषाओं में या तो उनकी पूरी तरह से कमी है या जितना संभव हो उतना उनसे बचें।

इंटरव्यू में ये प्रश्न इतने अधिक क्यों दिखाई देते हैं, इसका कारण यह है कि इनका उत्तर देने के लिए, आपको कई महत्वपूर्ण प्रोग्रामिंग अवधारणाओं - चर, फ़ंक्शन कॉल, स्कोप और निश्चित रूप से लूप और पुनरावृत्ति - की गहन समझ की आवश्यकता है, और आपके पास है तालिका में मानसिक लचीलापन लाने के लिए जो आपको दो अलग-अलग कोणों से एक समस्या का सामना करने और एक ही अवधारणा के विभिन्न अभिव्यक्तियों के बीच स्थानांतरित करने की अनुमति देता है।

अनुभव और शोध बताते हैं कि उन लोगों के बीच एक रेखा है जो चर, संकेत और पुनरावृत्ति को समझने की क्षमता रखते हैं, और जो नहीं करते हैं। प्रोग्रामिंग में लगभग सब कुछ, जिसमें फ्रेमवर्क, एपीआई, प्रोग्रामिंग भाषा और उनके किनारे के मामले शामिल हैं, का अध्ययन और अनुभव प्राप्त किया जा सकता है, लेकिन यदि आप इन तीन मुख्य अवधारणाओं के लिए अंतर्ज्ञान विकसित करने में असमर्थ हैं, तो आप एक प्रोग्रामर होने के लिए अयोग्य हैं। एक पुनरावृत्त संस्करण में एक सरल पुनरावृत्त लूप का अनुवाद गैर-प्रोग्रामर को फ़िल्टर करने के सबसे तेज़ संभव तरीके के बारे में है - यहां तक ​​कि एक अनुभवहीन प्रोग्रामर आमतौर पर इसे 15 मिनट में कर सकता है, और यह एक बहुत ही भाषा-अज्ञेय समस्या है, इसलिए उम्मीदवार चुन सकते हैं idiosyncracies पर ठोकर के बजाय उनकी पसंद की भाषा।

यदि आपको एक साक्षात्कार में इस तरह का प्रश्न मिलता है, तो यह एक अच्छा संकेत है: इसका मतलब है कि भावी नियोक्ता ऐसे लोगों की तलाश कर रहा है जो प्रोग्राम कर सकते हैं, न कि वे लोग जिन्होंने प्रोग्रामिंग टूल के मैनुअल को याद किया है।


3
मुझे आपका उत्तर सबसे अच्छा लगता है, क्योंकि यह सबसे महत्वपूर्ण पहलुओं को छूता है, जो इस प्रश्न का उत्तर हो सकता है, यह मुख्य तकनीकी भागों की व्याख्या करता है, और यह एक अच्छा ज़ूम-आउट दृश्य भी देता है कि यह मुद्दा प्रोग्रामिंग क्षेत्र में कैसे फिट बैठता है।
शिवन ड्रैगन

1
मैंने एक सिंक प्रोग्रामिंग में एक पैटर्न भी देखा है जहाँ लूप्स को पुनरावृत्त कॉल के पक्ष में टाला जाता है जिसमें एक .next () विधि होती है। मुझे लगता है कि यह सीपीयू लालची बनने से लंबे समय तक चलने वाला कोड रखता है।
इवान प्लाइस

1
पुनरावृत्त संस्करण में पुशिंग और पॉपिंग मान भी शामिल हैं। आपको बस ऐसा करने के लिए कोड लिखना होगा। पुनरावर्ती संस्करण स्टेट को एक पुनरावृत्ति एल्गोरिथ्म में स्टैक पर धकेल रहा है जिसे आपको आमतौर पर कुछ संरचना में राज्य को धक्का देकर मैन्युअल रूप से अनुकरण करना पड़ता है। केवल सबसे तुच्छ एल्गोरिदम को इस राज्य की आवश्यकता नहीं है और इन मामलों में संकलक आमतौर पर पूंछ की पुनरावृत्ति को देख सकते हैं और पुनरावृत्त समाधान लगा सकते हैं।
मार्टिन यॉर्क

1
@Dammers मुझे बता सकते हैं कि मैं आपके द्वारा बताए गए अध्ययन को कहां पढ़ सकता हूं "अनुभव और शोध बताते हैं कि लोगों के बीच एक रेखा है ..." यह मेरे लिए बहुत दिलचस्प लगता है।
यौ मात्सुओ

2
एक बात जिसका आप ज़िक्र करना भूल गए, पुनरावृत्ति कोड बेहतर प्रदर्शन करने के लिए जाता है जब आप निष्पादन के एक ही धागे के साथ काम कर रहे होते हैं, लेकिन पुनरावर्ती एल्गोरिदम खुद को कई थ्रेड्स में निष्पादित होने के लिए उधार देते हैं।
गॉर्डन

37

निर्भर करता है।

यह भी ध्यान देने योग्य है कि पूंछ पुनरावृत्ति के लिए समर्थन पूंछ को पुनरावर्ती और पुनरावृत्त छोरों के बराबर बनाता है, अर्थात, पुनरावृत्ति को हमेशा स्टैक को बर्बाद करने की आवश्यकता नहीं होती है।

इसके अलावा, एक पुनरावर्ती एल्गोरिदम को हमेशा एक स्पष्ट स्टैक का उपयोग करके पुनरावृत्त रूप से लागू किया जा सकता है ।

अंत में, मैं ध्यान दूंगा कि एक पांच-पंक्ति समाधान संभवतः 100 पंक्ति एक से बेहतर है (यह मानते हुए कि वे वास्तव में समकक्ष हैं)।


5
अच्छा जवाब (+1)। "एक 5 लाइन समाधान शायद 100 पंक्ति एक की तुलना में हमेशा बेहतर होता है": मुझे लगता है कि संक्षिप्तता केवल पुनरावृत्ति का लाभ नहीं है। पुनरावर्ती कॉल का उपयोग आपको विभिन्न पुनरावृत्तियों में मूल्यों के बीच कार्यात्मक निर्भरता स्पष्ट करने के लिए मजबूर करता है।
जियोर्जियो

4
छोटे समाधान बेहतर होते हैं, लेकिन इस तरह के एक चीज के रूप में अत्यधिक किया जा रहा है।
dan_waterworth

5
@dan_waterworth करने के लिए "100 लाइन" की तुलना में यह नहीं बल्कि मुश्किल है होना करने के लिए बहुत ज्यादा संक्षिप्त
कुटकी

4
@ जियोर्जियो, आप अनावश्यक कोड को हटाकर या स्पष्ट चीजों को निहित करके कार्यक्रम को छोटा बना सकते हैं। जब तक आप पूर्व से चिपके रहते हैं, आप गुणवत्ता में सुधार करते हैं।
dan_waterworth

1
@jk, मुझे लगता है कि स्पष्ट जानकारी को अंतर्निहित करने का एक और रूप है। एक चर का उपयोग किसके लिए किया जाता है, इसकी जानकारी उसके नाम से हटा दी जाती है, जहां यह स्पष्ट है और इसे उपयोग में धकेल दिया जाता है जो निहित है।
dan_waterworth

17

जब प्रोग्रामिंग की बात आती है, तो "बेहतर" की परिभाषा पर कोई सार्वभौमिक रूप से सहमत नहीं होता है, लेकिन मैं इसे "आसान बनाए रखने / पढ़ने में आसान" होने का अर्थ लूंगा।

पुनरावृत्ति में पुनरावृत्त लूपिंग निर्माणों की तुलना में अधिक अभिव्यंजक शक्ति होती है: मैं यह कहता हूं क्योंकि एक लूप एक पूंछ पुनरावर्ती कार्य के बराबर है और पुनरावर्ती कार्यों को पूंछ पुनरावर्ती की आवश्यकता नहीं है। शक्तिशाली निर्माण आमतौर पर एक बुरी चीज है क्योंकि वे आपको उन चीजों को करने की अनुमति देते हैं जो पढ़ना मुश्किल है। हालाँकि, पुनरावर्तन आपको लूप लिखने की क्षमता देता है बिना परस्परता का उपयोग किए और मेरे मन में पारस्परिकता पुनरावृत्ति की तुलना में अधिक शक्तिशाली है।

तो, कम अभिव्यंजक शक्ति से उच्च अभिव्यंजक शक्ति तक, लूपिंग निर्माण इस तरह से ढेर हो जाते हैं:

  • पूंछ पुनरावर्ती कार्य जो अपरिवर्तनीय डेटा का उपयोग करते हैं,
  • पुनरावर्ती कार्य जो अपरिवर्तनीय डेटा का उपयोग करते हैं,
  • जबकि लूप्स जो परस्पर डेटा का उपयोग करते हैं,
  • पारस्परिक डेटा का उपयोग करने वाले टेल पुनरावर्ती कार्य,
  • परस्पर कार्य, जो परस्पर डेटा का उपयोग करते हैं,

आदर्श रूप में, आप कम से कम अभिव्यंजक निर्माणों का उपयोग करेंगे जो आप कर सकते हैं। बेशक, यदि आपकी भाषा टेल कॉल ऑप्टिमाइज़ेशन का समर्थन नहीं करती है, तो यह आपकी पसंद के निर्माण को भी प्रभावित कर सकता है।


1
"एक समय में लूप एक पूंछ पुनरावर्ती कार्य के बराबर है और पुनरावर्ती कार्यों को पूंछ पुनरावर्ती की आवश्यकता नहीं है": +1। आप कुछ समय के लूप + स्टैक के माध्यम से पुनरावृत्ति का अनुकरण कर सकते हैं।
जियोर्जियो

1
मुझे यकीन नहीं है कि मैं 100% सहमत हूं, लेकिन यह निश्चित रूप से एक दिलचस्प परिप्रेक्ष्य है तो उसके लिए +1।
कोनराड रुडोल्फ

एक महान जवाब के लिए +1 और यह भी उल्लेख करने के लिए कि कुछ भाषाएं (या संकलक) टेल कॉल अनुकूलन नहीं करती हैं।
शिवन ड्रैगन

@Giorgio, "आप कुछ समय के लूप + स्टैक के माध्यम से पुनरावृत्ति अनुकरण कर सकते हैं", यही कारण है कि मैंने अभिव्यंजक शक्ति कहा। कम्प्यूटेशनल रूप से, वे समान रूप से शक्तिशाली हैं।
dan_waterworth

@dan_waterworth: बिल्कुल सही, और जैसा कि आपने अपने जवाब में कहा था, रिकर्सन अकेले लूप की तुलना में अधिक अभिव्यंजक है, क्योंकि आपको रिकर्स का अनुकरण करने के लिए कुछ समय के लिए स्टैक जोड़ने की आवश्यकता है।
जियोर्जियो

7

पुनरावृत्ति अक्सर कम स्पष्ट होती है। कम स्पष्ट बनाए रखना कठिन है।

यदि आप for(i=0;i<ITER_LIMIT;i++){somefunction(i);}मुख्य प्रवाह में लिखते हैं , तो आप इसे पूरी तरह से स्पष्ट कर देते हैं कि आप एक लूप लिख रहे हैं। यदि आप लिखते somefunction(ITER_LIMIT);हैं तो आप वास्तव में यह स्पष्ट नहीं करते हैं कि क्या होगा। केवल देखकर सामग्री: ऐसी somefunction(int x)कॉल somefunction(x-1)आपको बताता है कि यह वास्तव में पुनरावृत्तियों का उपयोग कर एक पाश है। इसके अलावा, आप आसानी से break;कहीं भागने की स्थिति के साथ भागने की स्थिति नहीं डाल सकते हैं , आपको या तो एक सशर्त जोड़ना होगा जो सभी तरह से वापस पारित हो जाएगा, या एक अपवाद फेंक देगा। (और अपवाद फिर से जटिलता जोड़ते हैं ...)

संक्षेप में, यदि यह पुनरावृत्ति और पुनरावृत्ति के बीच एक स्पष्ट विकल्प है, तो सहज बात करें। यदि पुनरावृत्ति आसानी से काम करती है, तो 2 पंक्तियों को सहेजना शायद ही सिरदर्द के लायक है जो इसे लंबे समय में बना सकता है।

बेशक अगर यह आपको 98 लाइनों को बचा रहा है, तो यह पूरी तरह से अलग मामला है।

ऐसी स्थितियां हैं जिनके लिए पुनरावृत्ति बस पूरी तरह से फिट बैठती है, और वे वास्तव में असामान्य नहीं हैं। पेड़ों की संरचनाओं का त्रैमासिक, बहु-जुड़े नेटवर्क, ऐसी संरचनाएं जो अपने स्वयं के प्रकार, बहुआयामी दांतेदार सरणियों को शामिल कर सकती हैं, अनिवार्य रूप से ऐसा कुछ भी जो एक सीधा वेक्टर या निश्चित आयामों की एक सरणी नहीं है। अगर आप किसी ज्ञात, सीधे रास्ते, यात्रा मार्ग पर चलते हैं। यदि आप अज्ञात में गोता लगाते हैं, तो पुनरावृत्ति करें।

अनिवार्य रूप से, अगर somefunction(x-1)अपने आप को एक से अधिक बार प्रति स्तर से बुलाया जाना है , तो पुनरावृत्तियों को भूल जाएं।

... पुनरावृत्ति से सबसे अच्छा काम करने वाले कार्यों के लिए पुनरावृत्तियाँ लिखना संभव है, लेकिन सुखद नहीं है। आप जहां भी उपयोग करेंगे int, आपको कुछ ऐसा चाहिए होगा stack<int>। मैंने इसे एक बार किया, व्यावहारिक उद्देश्यों की तुलना में अधिक अभ्यास के रूप में। एक बार ऐसे कार्य का सामना करने के बाद मैं आपको आश्वस्त कर सकता हूं कि आपके द्वारा व्यक्त किए गए संदेह नहीं होंगे।


10
जो स्पष्ट है और जो कम स्पष्ट है वह आंशिक रूप से इस बात पर निर्भर करता है कि आप किस चीज के अभ्यस्त हैं। प्रोग्रामिंग भाषाओं में Iteration का उपयोग अधिक बार किया जाता है क्योंकि यह CPU के काम करने के तरीके के करीब है (यानी यह कम मेमोरी का उपयोग करता है और तेजी से निष्पादित होता है)। लेकिन अगर आप प्रेरक रूप से सोचने के आदी हैं, तो पुनरावृत्ति उतनी ही सहज हो सकती है।
जियोर्जियो

5
"यदि वे एक लूप कीवर्ड देखते हैं, तो उन्हें पता चलता है कि यह एक लूप है। लेकिन कोई पुनरावर्ती कीवर्ड नहीं है, वे इसे केवल f (x) के अंदर f (x-1) देखकर पहचान सकते हैं।": जब आप एक पुनरावर्ती फ़ंक्शन को कॉल करते हैं। जानना नहीं चाहता कि यह पुनरावर्ती है। इसी तरह, जब आप किसी फ़ंक्शन को लूप कहते हैं, तो आप यह नहीं जानना चाहते हैं कि इसमें एक लूप होता है।
जियोर्जियो

3
@ एसएफ: हां, लेकिन आप इसे केवल तभी देख सकते हैं जब आप फ़ंक्शन के शरीर को देखते हैं। लूप के मामले में, आप लूप देखते हैं, पुनरावृत्ति के मामले में, आप देखते हैं कि फ़ंक्शन खुद को कॉल करता है।
जियोर्जियो

5
@ एसएफ: मेरे लिए परिपत्र तर्क की तरह एक सा लगता है: "अगर मेरे अंतर्ज्ञान में यह एक लूप है, तो यह केवल एक लूप है।" mapएक पुनरावर्ती फ़ंक्शन के रूप में परिभाषित किया जा सकता है (उदाहरण के लिए haskell.org/tutorial/functions.html देखें ), भले ही यह सहज रूप से स्पष्ट हो कि यह एक सूची का पता लगाता है और सूची के प्रत्येक सदस्य पर एक फ़ंक्शन लागू करता है।
जियोर्जियो

5
@ एसएफ, mapएक कीवर्ड नहीं है, यह एक नियमित कार्य है, लेकिन यह थोड़ा अप्रासंगिक है। जब कार्यात्मक प्रोग्रामर पुनरावृत्ति का उपयोग करते हैं, तो यह आमतौर पर नहीं होता है क्योंकि वे क्रियाओं का एक क्रम करना चाहते हैं, यह इसलिए है क्योंकि हल की जा रही समस्या को एक फ़ंक्शन और तर्कों की सूची के रूप में व्यक्त किया जा सकता है। समस्या फिर दूसरे फ़ंक्शन और तर्कों की एक अन्य सूची में कम हो सकती है। आखिरकार, आपके पास एक समस्या है जिसे तुच्छ रूप से हल किया जा सकता है।
dan_waterworth

6

हमेशा की तरह, यह सामान्य रूप से अकल्पनीय है क्योंकि अतिरिक्त कारक हैं, जो व्यवहार में मामलों के बीच व्यापक रूप से असमान हैं और एक उपयोग के मामले में एक दूसरे के लिए असमान हैं। यहाँ कुछ दबाव हैं।

  • लघु, सुरुचिपूर्ण कोड सामान्य से लंबे, जटिल कोड से बेहतर है।
  • हालाँकि, अंतिम बिंदु कुछ अमान्य है यदि आपका डेवलपर आधार पुनरावृत्ति और अनिच्छुक / सीखने में असमर्थ नहीं है। यह सकारात्मक होने के बजाय थोड़ा नकारात्मक भी हो सकता है ।
  • पुनरावृत्ति दक्षता के लिए खराब हो सकती है यदि आपको अभ्यास में गहरी-नेस्टेड कॉल की आवश्यकता होगी और आप पूंछ पुनरावृत्ति का उपयोग नहीं कर सकते हैं (या आपका वातावरण पूंछ पुनरावृत्ति का अनुकूलन नहीं कर सकता है)।
  • यदि आप ठीक से इंटरमीडिएट परिणाम कैश नहीं कर सकते हैं, तो कई मामलों में रिकर्सियन भी खराब है। उदाहरण के लिए, फाइबोनैचि संख्याओं की गणना करने के लिए पेड़ की पुनरावृत्ति का उपयोग करने का सामान्य उदाहरण कैश नहीं होने पर बहुत बुरा प्रदर्शन करता है । यदि आप कैश करते हैं, तो यह सरल, तेज, सुरुचिपूर्ण और पूरी तरह से अद्भुत है।
  • कुछ मामलों में पुनरावृत्ति लागू नहीं है, बस दूसरों में पुनरावृत्ति के रूप में अच्छा है, और अभी तक दूसरों में बिल्कुल आवश्यक है। व्यावसायिक नियमों की लंबी श्रृंखलाओं के माध्यम से प्लोडिंग आमतौर पर पुनरावृत्ति द्वारा मदद नहीं करता है। डेटा धाराओं के माध्यम से पुनरावृत्ति उपयोगी रूप से पुनरावृत्ति के साथ किया जा सकता है। बहुआयामी गतिशील डेटा संरचनाओं (जैसे mazes, ऑब्जेक्ट ट्री ...) से अधिक पुनरावृत्ति, स्पष्ट या अंतर्निहित बिना बहुत असंभव है। ध्यान दें कि इन मामलों में, स्पष्ट पुनरावृत्ति निहितार्थ की तुलना में बहुत बेहतर है - कोड पढ़ने की तुलना में कुछ भी अधिक दर्दनाक नहीं है जहां किसी ने अपने स्वयं के तदर्थ, अपूर्ण, छोटी भाषा स्टैक को भाषा के भीतर लागू किया है ताकि डरावना आर-शब्द से बचा जा सके।

पुनरावृत्ति के संबंध में कैशिंग से आपका क्या अभिप्राय है?
जियोर्जियो

@ जियोर्जियो संस्मरण
jk।

Feh। यदि आपका वातावरण टेल कॉल का अनुकूलन नहीं करता है, तो आपको एक बेहतर वातावरण मिलना चाहिए, और यदि आपके डेवलपर्स पुनरावृत्ति से अपरिचित हैं, तो आपको बेहतर डेवलपर्स ढूंढना चाहिए। कुछ मानक हैं, लोग!
सीए मैककैन

1

पुनरावृत्ति फ़ंक्शन को कॉल दोहराने के बारे में है, लूप स्मृति में जगह के लिए कूद को दोहराने के बारे में है।

स्टैक ओवरफ्लो के बारे में भी उल्लेख किया जाना चाहिए - http://en.wikipedia.org/wiki/Stack_overflow


1
रिकर्सियन का मतलब एक ऐसा फंक्शन है जिसकी परिभाषा कॉलिंग को ही मजबूर करती है।
हार्डमैथ

1
हालांकि आपकी सरल परिभाषा बिल्कुल 100% सटीक नहीं है, आप केवल एक ही हैं जो स्टैक ओवरफ्लो का उल्लेख करते हैं।
Qix

1

यह वास्तव में सुविधा या आवश्यकता पर निर्भर करता है:

यदि आप प्रोग्रामिंग भाषा पायथन लेते हैं , तो यह पुनरावृत्ति का समर्थन करता है, लेकिन डिफ़ॉल्ट रूप से पुनरावृत्ति की गहराई (1000) के लिए एक सीमा है। यदि यह सीमा से अधिक है, तो हमें एक त्रुटि या अपवाद मिलेगा। उस सीमा को बदला जा सकता है, लेकिन अगर हम ऐसा करते हैं कि हम भाषा में असामान्य स्थितियों का अनुभव कर सकते हैं।

इस समय (पुनरावृत्ति गहराई से अधिक कॉल की संख्या), हमें लूप निर्माणों को प्राथमिकता देना होगा। मेरा मतलब है, यदि स्टैक का आकार पर्याप्त नहीं है, तो हमें लूप के निर्माण को प्राथमिकता देना होगा।


3
यहाँ Guido van Rossum का एक ब्लॉग है कि क्यों वह पाइथन में पूंछ-पुनरावृत्ति अनुकूलन नहीं चाहता है (इस धारणा का समर्थन करते हुए कि विभिन्न भाषाएँ अलग-अलग सामरिक दृष्टिकोण लेती हैं)।
हार्डमैथ

-1

रणनीति डिजाइन पैटर्न का उपयोग करें।

  • पुनर्मिलन साफ ​​है
  • लूप्स (यकीनन) कुशल हैं

आपके लोड (और / या अन्य शर्तों) के आधार पर, एक चुनें।


5
रुको क्या? रणनीति का पैटर्न यहां कैसे फिट होता है? और दूसरा वाक्य एक खाली वाक्यांश की तरह लगता है।
कोनराड रुडोल्फ

@KonradRudolph मैं पुनरावृत्ति के लिए जाना जाएगा। डेटा के बहुत बड़े सेट के लिए, मैं लूप पर स्विच करूंगा। मेरा मतलब यही था। अगर यह स्पष्ट नहीं था तो मैं माफी चाहता हूं।
प्रवीण सोनावने

3
आह। खैर, मुझे अभी भी यकीन नहीं है कि इसे "रणनीति डिजाइन पैटर्न" कहा जा सकता है, जिसका एक बहुत ही निश्चित अर्थ है और आप इसे रूपक का उपयोग करते हैं। लेकिन अब कम से कम मैं देख रहा हूं कि आप कहां जा रहे हैं।
कोनराड रुडोल्फ

@KonradRudolph ने एक महत्वपूर्ण सबक सीखा। आप जो कहना चाहते हैं, उसे गहराई से समझाइए .. धन्यवाद .. जिसने मदद की .. :)
प्रवीण सोनवणे

2
@ प्रवीण सोनवणे: यदि आप पूंछ पुनरावृत्ति अनुकूलन का उपयोग कर सकते हैं तो आप पुनरावर्तन का उपयोग विशाल डेटा सेटों पर भी कर सकते हैं।
जियोर्जियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.