2015-09-10 4 views
5

चूंकि मैं स्कैला में आया, मैंने पूंछ रिकर्सन का उपयोग करके फ़ंक्शन लिखना शुरू किया, और सीखा कि सी ++ कंपाइलर्स इसका भी समर्थन करते हैं, और पूंछ रिकर्सिव फ़ंक्शंस को भी अनुकूलित करते हैं। अब मैं उत्सुक हूं कि ऑप्टिमाइज़ेशन कितना भरोसेमंद है, और क्या यह मेरे मुख्य लूप या कमांड प्रॉम्प्ट जैसी चीज़ों के लिए उपयोग करना ठीक है?स्कैला/सी ++: इनपुट लूप के बजाय टेल रिकर्सिव फ़ंक्शन

इस तरह परंपरागत रूप से मैं लिखा है आदेश संकेतों:

bool running = true; 
string input; 
while(running_){ 
    input = getInput(); 
    executeCommand(input); 
    if(input == "quit") running_ = false; 
} 

अब यह एक बुरी बात इस तरह एक पूंछ पुनरावर्ती क्रिया के साथ इस को बदलने के लिए हो सकता है?

string input = "nothing"; 
void parseInput(){ 
    if(input != "nothing") executeCommand(input); 

    getline(cin, input); 
    if(input != "quit") parseInput(); 
} 
+0

शानदार विचार! – UmNyobe

उत्तर

2

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

यह सुनिश्चित करने के लिए कि टीसीओ हुआ है, आपको अपने सबसे अच्छे दोस्त पर भरोसा करना है। आपका सबसे अच्छा दोस्त एएसएम आउटपुट है।

+0

क्या यह संकलक-मित्रवत होगा यदि मैंने लिखा है कि अगर (इनपुट! = "छोड़ें") इस समारोह(); अन्य cout << "अलविदा! \ n"; '? – BigBadWolf

+0

@ बिगबैडवॉल्फ, इस समारोह को कॉल करने के बाद बस शाखा के अंदर वापसी करें। – SergeyA

संबंधित मुद्दे