मैंने टेल रिकर्सन का परीक्षण करने के लिए सी ++ (विजुअल स्टूडियो का उपयोग करके) में एक अभ्यास के रूप में एक साधारण फाइबोनैकी फ़ंक्शन लिखा है और यह देखने के लिए कि यह कैसे काम करता है।सी ++ 64-बिट चर का उपयोग कर पूंछ रिकर्सन
इसकोड है:
int fib_tail(int n, int res, int next) {
if (n == 0) {
return res;
}
return fib_tail(n - 1, next, res + next);
}
int main()
{
fib_tail(10,0,1); //Tail Recursion works
}
जब मैं रिलीज मोड का उपयोग कर संकलित मैं एक कॉल के बावजूद जेएमपी अनुदेश का उपयोग कर अनुकूलित विधानसभा देखा। तो मेरा निष्कर्ष था: पूंछ रिकर्सन काम करता है। नीचे चित्र देखें:
मैं अपने फाइबोनैचि समारोह में इनपुट चर n में वृद्धि से कुछ प्रदर्शन परीक्षण करना चाहता था। मैंने फिर इंटरफ़ेस से लंबे समय तक हस्ताक्षर किए गए फ़ंक्शन में उपयोग किए गए वेरिएबल प्रकार को बदलने का विकल्प चुना। तब मैं पारित कर दिया की तरह एक बड़ी संख्या: 10e + 08
यह अब नए कार्य है:
typedef unsigned long long ULONG64;
ULONG64 fib_tail(ULONG64 n, ULONG64 res, ULONG64 next) {
if (n == 0) {
return res;
}
return fib_tail(n - 1, next, res + next);
}
int main()
{
fib_tail(10e+9,0,1); //Tail recursion does not work
}
जब मैं कोड भाग गया ऊपर मैं एक ढेर अतिप्रवाह अपवाद है, जो मुझे लगता है कि पूंछ प्रत्यावर्तन था मिल गया काम नहीं कर रहा। मैं विधानसभा को देखा और वास्तव में मैं इस पाया:
जैसा कि आप देख अब वहाँ एक कॉल अनुदेश जबकि मैं केवल एक साधारण जेएमपी उम्मीद कर रहा था है। मैं समझ नहीं पा रहा हूं कि एक 8 बाइट वेरिएबल का उपयोग क्यों पूंछ रिकर्सन अक्षम करता है। क्यों कंपेलर ऐसे मामले में अनुकूलन नहीं करता है?
क्या आप 32-बिट प्लेटफॉर्म को लक्षित कर रहे हैं? –
हां, मैं Win32 – codingadventures
@JohnField को लक्षित कर रहा हूं क्या आप लंबे समय तक फ़ंक्शन के वीएस जेनरेट किए गए डिस्सेप्लर प्रदान कर सकते हैं? – rutsky