2011-10-27 13 views
8

मान लीजिए कि सी ++ में आप रिकर्सिव फ़ंक्शन पर बहुत अधिक रिकर्सिव कॉल कर रहे हैं और स्टैक ओवरफ़्लो त्रुटि प्राप्त कर रहे हैं।सी ++ निरंतरता-गुजरने वाली शैली का उपयोग कैसे कर सकता है?

स्टैक ओवरफ़्लो से बचने के लिए आप निरंतर-गुजरने वाली शैली में इसे कैसे लिखेंगे?

मुझे सी ++ में इसे चित्रित करने में थोड़ी सी कठिनाई हो रही है।

+2

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

+0

आप सही जगह पर आए थे। –

+0

@ildjarn, नोटिस के लिए धन्यवाद। मैं वास्तव में एक अमूर्त उत्तर की तलाश में हूं। अगर मैं एक संचयक का उपयोग करता हूं, तो क्या मैं इसे सी ++ में सामान्य पुनरावृत्ति के रूप में पुनः लिखना नहीं चाहूंगा? – achow

उत्तर

4

वैसे यह एक खुला खुला प्रश्न है, लेकिन एरिक लिपर्ट ने long series about exactly this topic बल्कि एक (वास्तव में दो वास्तव में) लिखा था। बिल्कुल सही भाषा नहीं है, लेकिन यह अभी भी सहायक होनी चाहिए और सामान्य विचार देना चाहिए।

हालांकि सी ++ में सीपीएस लागू करने के लिए केवल एक ही रिकर्सिव फ़ंक्शन को ठीक करने के लिए बहुत सारे काम की तरह लगता है, जब आप कतार के साथ फ़ंक्शन को पुन: सक्रिय करने के लिए केवल कुछ एल्गोरिदम का उपयोग कर सकते हैं (आप अभी भी मूल रूप से डेटा की समान मात्रा का उपयोग करते हैं, लेकिन ढेर बहुत कम प्रतिबंधित है)।

+1

मुझे उन दोनों श्रृंखलाओं के संदर्भ में उन श्रृंखलाओं को लिखने का विशिष्ट लाभ था, जिनमें अंतर्निहित भाषा सुविधा के रूप में शब्दावली बंद हैं। बंद करने में सी ++ कोड को फिर से लिखना निश्चित रूप से पूरी तरह से प्राप्त करने योग्य है, लेकिन यह दर्द का थोड़ा सा होगा। –

+1

@EricLippert आप सही हैं I C++ 11 lambdas मानते हैं, लेकिन स्पष्ट रूप से सभी (अच्छी तरह से बहुमत के करीब भी नहीं) में एक कंपाइलर है जो लैम्ब्डा का समर्थन करता है। इसके बिना, यह अधिक जटिल हो जाता है (कक्षाओं का उपयोग करें और अनुमानित रूप से उन लोगों को पास करें?)। बीटीडब्ल्यू आपके महान लेखों के लिए धन्यवाद - आपके बिना मैं यह भी नहीं जानता कि सीपीएस क्या है :) – Voo

+2

@Voo: सी ++ 11 लैम्बडा के बिना भी, सी ++ 03 पुस्तकालय हैं जो इस छोटे से संभालते हैं। उदाहरण देखें [Boost.Phoenix] (http://www.boost.org/libs/phoenix/)। – ildjarn