2009-08-22 11 views
5

के साथ रिकर्सिव फ़ंक्शन मेरे पास एक स्थैतिक चर "गणना" के साथ एक पुनरावर्ती कार्य है। फ़ंक्शन वृद्धि क्रमशः गिनती होती है और चूंकि इसमें फ़ाइल स्कोप होता है, जब मैं दूसरी बार foo() को कॉल करता हूं, तो गिनती अभी भी 5 के बराबर होती है। क्या दूसरी बार foo() को कॉल करने से पहले 0 पर गिनती रीसेट करने की कोई तकनीक है?स्थैतिक चर

असल में, मैं गिनती नहीं चाहता कि फ़ाइल का दायरा हो लेकिन मैं इसे विभिन्न पुनरावृत्तियों के माध्यम से अपना मूल्य बरकरार रखना चाहता हूं।

एक तरीका मैं ऐसा करने के बारे में सोच सकता हूं foo() को foo() में प्रारंभ करने के लिए एक तर्क है। जैसे foo (int count)। लेकिन क्या कोई और तरीका है?

#include <iostream> 

using namespace std; 

void foo() 
{ 
    static int count = 0; 

    if(count<5) 
    { 
     count++; 
     cout<<count<<endl; 
     foo(); 
    } 
    else 
    { 
     cout<<"count > 5"<<endl; 
    } 
} 

int main() 
{ 
    foo(); //increment count from 0 to 5 
    foo(); //count is already at 5 

    return 0; 
} 
+1

क्या कोई विशेष कारण है कि आप इसे पैरामीटर के रूप में पास करने के बजाय स्थिर गणना का उपयोग कर रहे हैं? इस तरह के पुनरावर्ती कार्यों में स्थैतिक चर का उपयोग करना सामान्य रूप से एक बुरा विचार माना जाता है, ठीक इसी तरह की चीजों के कारण। –

+0

स्थिर के लिए कोई विशेष कारण नहीं है। नीचे दिए गए उत्तरों से, मैं इस बात से सहमत हूं कि इस बारे में जाने का सबसे अच्छा तरीका एक तर्क होगा। – Steve

उत्तर

19

एक और अधिक मुहावरेदार जिस तरह से यह दो कार्यों में विभाजित करने के लिए है:

void foo() { 
    foo_recursive(0); 
} 

void foo_recursive(int count) { 
    if (count < 5) { 
     count++; 
     cout << count << endl; 
     foo_recursive(count); 
    } else { 
     cout << "count > 5" << endl; 
    } 
} 

कौन सा foo() लिए एक तर्क की आपूर्ति करने के लिए और भी आप एक स्थिर चर की जरूरत नहीं है फोन करने वाले की जरूरत नहीं को लाभ मिलता है (जो मुझे हमेशा एक बुरा विचार लगता है)।

void foo() { 
    if (count >= 5) { 
    cout<<"count >= 5"<<endl; 
    count = 0; 
    return; 
    } 

    cout<<++count<<endl; 

    foo(); 
} 

बॉयलरप्लेट कोड बचाता है:

+2

शायद यह करने का सबसे अच्छा तरीका है। +1 जब तक कि कुछ अजीब कारण नहीं है कि उसे इसके लिए स्थिर चर की आवश्यकता है ... –

+2

तर्क डिफ़ॉल्ट हैं इसलिए आपको कोई नया फ़ंक्शन नहीं करना है। हम यहां सी ++ का उपयोग कर रहे हैं। शून्य foo (int count = 0) { – Potatoswatter

+4

डिफ़ॉल्ट तर्कों को डिफ़ॉल्ट विकल्प मान चाहिए जो अनिवार्य रूप से कॉलर के पक्ष में हैं। हालांकि, इस मामले में तर्क एक कार्यान्वयन विस्तार है, और किसी अन्य समारोह के पीछे छिपा होना चाहिए।आप नहीं चाहते कि कॉलर गिनती के रूप में "100" पास करे, क्या आप? –

6

बाकी

else 
{ 
    cout<<"count > 5"<<endl; 
    count = 0; 
} 

में यह रखो आप ठीक ढंग से प्रत्यावर्तन Waxwing के जवाब की जाँच करना चाहते हैं।

+0

यह सबसे अच्छा तरीका लगता है। (+1) –

4

स्थिर चर का उपयोग करने के बजाय, बस एक तर्क के रूप में गिनती पास करें।

void foo(int count) { 
    if (count < 5) { 
     count++; 
     cout << count << endl; 
     foo(count); 
    } else { 
     cout << "count > 5" << endl; 
    } 
} 

int main() { 
    foo(0); 
    foo(0); 
} 

स्टेटिक चर और रिकर्सन आम तौर पर एक साथ नहीं जाते हैं।

0

आप एक बूलियन चर स्वीकार करने के लिए foo को बदल सकते हैं जिसका अर्थ है रीसेट या नहीं।

void foo() { 
    foo(false); 
} 

void foo(int b) 
{ 
    static int count = 0; 

    if(b) { count = 0 }; 

    ... 
} 

कॉल foo() से पहले के रूप में, या foo (सही), यदि आप इसे रीसेट करना चाहते हैं।

0

आप समारोह ऑटो रीसेट करने इस तरह से बना सकते हैं।

0
void foo() { 
    ... 
    if (count > 0) count--; // you can decrease it at then end of foo() 
} 
0

कोई भी दो समारोह की घोषणा या स्थिर चर का उपयोग करने की आवश्यकता के बारे में कैसे। आप डिफ़ॉल्ट तर्क का उपयोग कर सकते हैं।

// Use Default arguments 
void foo(int count = 0); 

void foo(int count) 
{ 
    if(count<5) 
    { 
     count++; 
     cout<<count<<endl; 
     foo(count); 
    } 
    else 
    { 
     cout<<"count > 5"<<endl; 
    } 
} 

int main() 
{ 
    foo(); // by default argument =0 
    foo(); // by default argument =0 

    return 0; 
}