मुझे आश्चर्य है कि क्या ओकैम इस कोड को पूंछ रिकर्सिव होने के लिए अनुकूलित करता है और यदि ऐसा होता है तो F #?क्या यह फ़ंक्शन पूंछ रिकर्सन का उपयोग करता है?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
मुझे आश्चर्य है कि क्या ओकैम इस कोड को पूंछ रिकर्सिव होने के लिए अनुकूलित करता है और यदि ऐसा होता है तो F #?क्या यह फ़ंक्शन पूंछ रिकर्सन का उपयोग करता है?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
पुनरावर्ती मामले में (यानी मामला कि x खाली नहीं है) अंतिम मूल्यांकन ऑपरेशन अतिरिक्त है। फ़ंक्शन को पूंछ-रिकर्सिव होने के लिए अंतिम मूल्यांकन ऑपरेशन को रिकर्सिव कॉल करने की आवश्यकता है।
इस तरह के कार्यों को आमतौर पर एक सहायक उपकरण के साथ एक सहायक कार्य का उपयोग करके परिभाषित किया जाता है ताकि उन्हें पूंछ-पुनरावर्ती बना दिया जा सके। इस मामले में यह एक ऐसा कार्य होगा जो सूची को सारांशित किया जाएगा और योग का वर्तमान मूल्य होगा। यदि सूची खाली है, तो यह राशि के वर्तमान मूल्य को वापस कर देगी। यदि सूची खाली नहीं है, तो यह सूची की पूंछ और योग के वर्तमान मूल्य के रूप में सूची के प्रमुख के रूप में स्वयं को कॉल करेगा। योग फ़ंक्शन तब सूची के साथ हेल्पर फ़ंक्शन को कॉल करेगा और 0 योग के वर्तमान मान के रूप में होगा।
नहीं, यह कोड पूंछ पुनरावर्ती नहीं है, और ocaml यह परिणत नहीं होंगे। आपको इसे स्वयं करना है।
मुझे एफ # के लिए पता नहीं है, लेकिन मुझे संदेह है कि यह इसे अनुकूलित करेगा।
हां, इसलिए यह ऑप्टिकल करने के लिए ओकैम के लिए कठिन नहीं लगता है। बस एक मौजूदा वैल पैराम जोड़ें और sum xs ', currentSum पर कॉल करें। यह सरल जानना मैं जानना चाहता था कि यह अनुकूलित है या नहीं। तो आप कहते हैं कि यह हम्म नहीं है .. मेरे पास इस मशीन पर ओकैमल डिब्बे नहीं हैं इसलिए मैं जांच नहीं कर सकता और जान सकता हूं कि यह क्यों होगा या नहीं। –
@ acidzombie24 यह इस मामले में अनुकूलित हो सकता है, लेकिन यदि आप इस पर भरोसा करते हैं तो आप थोड़ा अधिक जटिल मामलों पर स्टैक ओवरफ्लो का अनुभव करेंगे जहां संकलक परिवर्तन नहीं कर सकता। उदाहरण के लिए आप किसी अन्य मॉड्यूल से शुद्ध फ़ंक्शन के साथ समान परिवर्तन की उम्मीद कर सकते हैं, और आप इसकी अपेक्षा करने का अधिकार करेंगे, लेकिन संकलन के लिए अलग संकलन के कारण रूपांतरण करना असंभव होगा और क्योंकि इंटरफेस निर्दिष्ट नहीं करते कि कौन से फ़ंक्शन हैं शुद्ध। –