कृपया निम्नलिखित कोड में रिकर्सन स्टेटमेंट के काम को समझाएं।जावा में रिकर्सन यह कैसे काम करता है?
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1) * n;
return result;
}
मेरे समझ है कि:
ऊपर बयान factR(n-1)
विधि अंत तक ही कॉल में। मान लीजिए कि हम 6 का फैक्टोरियल प्राप्त करना चाहते हैं, जिसे इस विधि को तर्क के रूप में भेजा जाएगा। इसे n
पैरामीटर के रूप में प्राप्त किया जाएगा, और n
का मान चेक किया जाएगा; यदि यह 1 है तो 1 वापस कर दिया जाएगा। लेकिन अगर यह 1 नहीं है, जैसा कि हमारे मामले में 6 है, तो रिकर्सेशन स्टेटमेंट चलाएगा।
अब मुझे जिस समस्या का सामना करना पड़ता है वह यह है कि पहली बार n-1
5 हो जाता है और एन द्वारा गुणा किया जाता है, जिसमें मूल्य 6 होता है, तो यह 30 हो जाता है। अब वह 30 कहाँ होगा?
फिर विधि स्वयं को कॉल करेगी और इस बार n-1
4 हो जाता है और फिर यह n
के साथ गुणा करता है, जिसमें "6" मान 4 * 6 = 24 मानता है जो मुझे लगता है कि गलत है। क्योंकि अगर हम इस तरह से जाते हैं तो अगली कॉल प्रक्रिया में कुछ ऐसा होगा, n-1
3 * एन बन जाएगा जो IF समान मान रखता है यानी 6 तो यह 3 * 6 = 18 बन जाएगा। फिर अगला कॉल होता है और n-1
यदि हम गुणा करते हैं और मानते हैं कि n
मान 6 है तो 2 * 6 = 12, और अंतिम कॉल n-1
= 1 * n = 6. मेरा बिंदु यह है कि यह स्पष्ट है कि n-1
मान n-1
यानी 6-1 कम करेगा = 5 फिर 5-1 = 4 फिर 4-1 = 3 फिर 3-1 = 2 और 2-1 = 1। लेकिन सवाल यह है कि n
का मूल्य क्या होगा जब विधि स्वयं कॉल होने पर हर बार गुणा किया जाएगा?
यदि आप कहते हैं कि जब पहली गुणा होती है यानी "एन -1" 5 हो जाती है तो 6 = 30 से गुणा हो जाती है और 30 को "एन" पर संग्रहीत किया जाता है, फिर अगली कॉल में 5-1 = 4 * 30 = 120 , फिर 4-1 = 3 * 120 = 360, फिर 3-1 = 2 * 360 = 720, और आखिरी 1 * 720 = 720 पर, जावा परिणामस्वरूप मान को वैरिएबल n
में वापस करने का निर्धारण कैसे करता है?
मैं क्या चर result
का मूल्य हर बार विधि इस तरह से ही कहते हैं, इस तरह है की जाँच करने के एक और बयान देते हैं:
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1)*n ;
System.out.println(result);
return result;
}
तो मैं मिलता है इस उत्पादन:
2
6
24
120
720
Factorial of 6 is 720
मुझे समझ में नहीं आता कि यह अपनी पहली कॉल में 2 कैसे उत्पन्न करता है। मूल्य 2 और फिर 6, 24, 120 और 720 कहां से आते हैं? मुझे लगता है कि मैं कोड के काम में गंभीर रूप से फंस गया हूँ।
क्या आपने कोड डीबग करने का प्रयास किया था? – TheLostMind
आप गलत तरीके से हैं। आपके मामले में इसे पहले '30' नहीं मिलेगा। यह '1 * 2' के साथ शुरू होगा -> परिणाम को कॉलर मेथोट' * 3' -> को कॉलर विधि '* 4' पर परिणाम पास करें। रिकर्सन कॉल की प्रत्येक कॉल स्टैक पर डाल दी जाती है, जो शीर्ष (अंतिम कॉल) से नीचे तक पहुंच जाती है (पहली कॉल) जब वह उस बिंदु तक पहुंच जाती है जहां यह कोई और रिकर्सन नहीं करता है। – SomeJavaGuy
2 पहला कॉल नहीं है, दूसरा है, यह सिर्फ इतना है कि आपका पहला कॉल प्रिंटल – valepu