Recursion in C++ , call by Value, call by reference

Call by Value(कॉल बाय वैल्यू)

जब किसी फंक्शन को कॉल किया जाता है तो उसमें इनपुट के रूप में दिए गए वेरिएबलों की वैल्यू फंक्शन definition(डेफिनेशन) में लिखे गए वेरिएबल में स्टोर हो जाती है अन्य शब्दों में call(कॉल) किए गए फंक्शन में अलग वेरिएबल बनते हैं। जिनकी वैल्यू calling function(कॉलिंग फंक्शन) के वेरिएबलों के समान होती है इसे call by Value(कॉल बाई वैल्यू) कहते हैं सरल शब्दों में किसी फंक्शन को बाय वैल्यू करने पर कॉल करते समय भेजी जाने वाली वैल्यू definition(डेफिनेशन) वाले वेरिएबल में कॉपी हो जाती है।

Example:-


    #include <iostream>
    #include <conio.h>
    using namespace std;
    void fun(int a)
    {
        a = 20;
        cout << "\nthe value of 'a' in side function :  " << a;
    }
    int main()
    {
        int a = 10;
        cout << "\nthe value of 'a' is " << a;
        fun(a);
        cout << "\nthe value of 'a' is " << a;
        return 0;
    }

    

Output:-

the value of 'a' is 10
the value of 'a' in side function : 20
the value of 'a' is 10

Explain Example:-

उपरोक्त उदाहरण में fun(a); के माध्यम से वे वेरिएबल a की वैल्यू को fun(int a) के डिक्लेरेशन में प्रयुक्त वेरिएबल a में स्टोर करवाया जा रहा है। यह ध्यान दें कि main() में प्रयोग किया गया वेरिएबल a फंक्शन fun()में प्रयोग किए गए वेरिएबल a से अलग है। दोनों वेरिएबल मेमोरी में अलग-अलग निम्न प्रकार स्थान लेंगे।

Call by reference(कॉल बाय रेफरेंस)

यदि फंक्शन को कॉल करते समय उसमें वेरिएबल की वैल्यू ना भेजकर, उनका एड्रेस भेजा जाए तो इसे कॉल बाय रेफरेंस करते हैं।

क्योंकि इस स्थिति में वेरिएबल का एड्रेस भेजा जाता है, अतः वैल्यू में परिवर्तित वास्तविक वेरीएबल में ही होते हैं।

Example:-

नीचे दिए गए उदाहरण में फंक्शन को बाय रेफरेंस कॉल किया गया है।  


    #include <iostream>
    #include <conio.h>
    using namespace std;
    void fun(int *a);
    int main()
    {
        int a = 10;
        cout << "\n The value of a  before call fun function : " << a;
        fun(&a);
        cout << "\n The value of an after calling fun function : " << a;
        return 0;
    }
    void fun(int *a)
    {
        *a = 20;
        cout << "\n The value of an inside function : " << a;
    }

Output:-

The value of a before call fun function : 10
The value of an inside function : 48548
The value of an after calling fun function : 20

Explain Example:-

ऊपर दिए गए उदाहरण में fun(&a); के माध्यम से वेरिएबल a का मेमोरी ऐड्रेस fun(int *a) थे डिक्लेरेशन में प्रयुक्त प्वाइंटर वेरिएबल a में स्टोर करवाया जा रहा है। ध्यान दे फंक्शन fun() के डिक्लेरेशन में *a = 20 के माध्यम से वास्तविक वेरिएबल [main()] में ही 20 करवा दिया गया है। इस प्रकार यह स्पष्ट हो जाता है कि पॉइन्टर के माध्यम से वास्तविक वेरिएबल की वैल्यू में परिवर्तन किया जा सकता है।

नीचे दिए गए मेमोरी लोकेशन से भी यह स्पष्ट हो जाता है।

function in C Language, w3 coding club, w3codingclubRecursion(रिकर्जन)

यदि कोई फंक्शन समय को ही कॉल करें तो ऐसे फंक्शन कोर recursive(रिकर्सिव) फंक्शन करते हैं। तथा इस प्रक्रिया को recursion(रिकर्जन) कहते हैं। recursion(रिकर्जन) प्रयोग करने पर प्रोग्राम की गति अधिक रहती है तथा प्रोग्राम की जटिलता कम होती है।

Example:-

नीचे दिए गए उदाहरण में recursion(रिकर्जन) का प्रयोग करते हुए 1 से 5 तक की संख्या प्रिंट करवाई गई है।

    
    #include <iostream>
    #include <conio.h>
    #include <stdlib.h>
    using namespace std;
    int a = 1;
    int main()
    {
        cout << a << endl;
        if (a >= 5)
        {
            exit(0);
        }
        a++;
        main();
        return 0;
    }

Output:-

1
2
3
4
5

Explain Example

ऊपर दिए गए उदाहरण में फंक्शन main() में वापस main() को कॉल करवाया गया है। किंतु यह ध्यान दें इसमें int a = 1; के माध्यम से एक global variable(ग्लोबल वेरिएबल) a declared(डिक्लेअर) किया गया है। किसी वेरिएबल को फंक्शन के बाहर डिक्लेअर करने पर यह global variable(ग्लोबल वेरिएबल) बन जाता है तथा सभी फंक्शन उसे प्रयोग करने में सक्षम हो जाते हैं।
यह भी ध्यान दें कि main() में a++ करते हुए वेरिएबल a की वैल्यू में प्रत्येक बार increment(इंक्रीमेंट) भी किया जा रहा है। इससे recursion में प्रत्येक बार वेरिएबल a की वैल्यू बढ़ते हुए अंततः 5 से अधिक हो जाएगी। जैसे ही यह वैल्यू 5 से अधिक होगी if(a>=5) इसके कारण से exit(0); statement(स्टेटमेंट) रन हो जाएगा और प्रोग्राम यहीं समाप्त हो जाएगा। 
ध्यान रखें कि यदि उपरोक्त उदाहरण में से a++ हटा दिया जाए तो प्रोग्राम रन कराने पर यह कभी भी नहीं रुकेगा। exit() फंक्शन stdlib.h header file(हेडर फाइल) में define(डिफाइन) किया हुआ होता है अतः प्रोग्राम में stdlib.h header file(हेडर फाइल) को include(इंक्लूड) किया गया है। 

 जब भी recursion(रिकर्जन) का प्रयोग किया जाए तो यह ध्यान रखें कि उसने कोई ऐसी कंडीशन डाली जाए जो कभी ना कभी प्रोग्राम को रोके, अन्यथा प्रोग्राम लगातार रन होता रहेगा। 

Example:-

नीचे दिए गए उदाहरण में factorial(फैक्टोरियल ) की गणना करने के लिए recursion(रिकर्जन) का प्रयोग किया गया हैं।


    #include <iostream>
    #include <conio.h>
    using namespace std;
    int fact(int x);
    int main()
    {
        int a, f;
        cout << "\n Enter a Number : ";
        cin >> a;
        f = fact(a);
        cout << "\n The Factorial of " << a << " = " << f;
        getch();
        return 0;
    }

    int fact(int x)
    {
        int s;
        if (x == 1)
        {
            return (1);
        }
        else
        {
            s = x * fact(x - 1);
            return (s);
        }
    }
 

Output:-

Enter a Number : 3
The Factorial of 3 = 6

Explain Example

ऊपर दिए गए उदाहरण में main() में s = fact(a); के माध्यम से fact() function(फंक्शन) को वेरिएबल a की वैल्यू भेजी  जा रही हैं। यदि वेरिएबल a की वैल्यू  3 होती है तो fact() के डिक्लेरेशन में s = a*fact(a-1); के माध्यम से यह statement(स्टेटमेंट) s = a*fact(3-1); हो जाता है। इससे यह बात fact() को a की वैल्यू के रूप में 2 प्राप्त होता हैं। 

  इस प्रकार आगे बढ़ते हुए जब वेरिएबल a की वैल्यू एक प्राप्त होगी तो फंक्शन fact() की execution(एग्जीक्यूशन) को रोका जा रहा हैं, 1 return(रिटर्न) करवाया जा रहा हैं। उपरोक्त प्रोग्राम को निम्नांकित diagram(डायग्राम) की सहायता से आसानी से समझा जा सकता है 



Most important point

फंक्शन एक या एक से अधिक statement(स्टेटमेंट ) का समय होता हैं। फंक्शन का प्रयोग किसी विशेष कार्य को करने के लिए किया जाता हैं।

कोई भी फंक्शन इनपुट में तो एक से अधिक वैल्यू ले सकता है किंतु आउटपुट में वह सिर्फ एक ही वैल्यू return(रिटर्न) कर सकता हैं।

फंक्शन को प्रयोग करने से प्रोग्राम का आकार छोटा हो जाता है, गलतियों को सुधारने में आसानी रहती है तथा कम मेमोरी की आवश्यकता रहती हैं।

Inbuilt functions(इनबिल्ट फंक्शन) की फाइल में पहले से ही बने होते हैं। प्रोग्राम में प्रयोग करने के लिए हमें अपने प्रोग्राम में संबंधित शामिल करना होता हैं।

User defined function(यूजर डिफाइंड फंक्शन) वे फंक्शन होते हैं जिन्हें यूजर अपनी आवश्यकता के अनुसार किसी विशेष कार्य को करने के लिए बनाता हैं।

Function declaration(फंक्शन डिक्लेरेशन) compiler(कंपाइलर) को यह बताता है कि नए बनाए जाने वाले फंक्शन का नाम क्या है तथा वह इनपुट में कितनी वैल्यू तथा उस वैल्यू का data type(डाटा टाइप) क्या होगा।

जब भी फंक्शन को कॉल करवाया जाता है तो संबंधित फंक्शन मेमोरी में उसी वक्त लोड होता है। इसका आशय यह है कि वह फंक्शन हर समय मेमोरी में नहीं रहता और सिर्फ आ सकता पड़ने पर ही मेमोरी में जगह घेरता हैं।

किसी फंक्शन को बाय वैल्यू कॉल करने पर कॉल करते समय भेजी जाने वाली वैल्यू definition(डेफिनेशन) वाले वेरिएबल में स्टोर(कॉपी) हो जाती हैं।

यदि फंक्शन को कॉल करते समय उसमें वेरिएबल की वैल्यू ना भेजकर उसका address(एड्रेस) भेजा जाए तो इसे call by reference(कॉल बाय रेफरेंस) कहते हैं।

यदि किसी फंक्शन से एक से अधिक वैल्यू रिटर्न करवानी हो तो उसके लिए call by reference(कॉल बाय रेफरेंस) तकनीक का प्रयोग किया जा सकता हैं।

यदि कोई फंक्शन है स्वयं को ही कॉल करें तो ऐसे फंक्शन को एक recursive function(रिकर्सिव फंक्शन) करते हैं तथा इस प्रक्रिया को रिकर्जन करते हैं रिकजन प्रयोग करने पर प्रोग्राम की गति अधिक रहती है तथा प्रोग्राम की जटिलता कम होती हैं।

Post a Comment

0 Comments