मेरे पास एक ऐसा कार्य है जिसमें तारांकित रेखा एक पुनरावर्ती कॉल शामिल संयोजन है। संयोजन के रूप में काम करते हैं, अगर h1 <> h2
तो रिकर्सिव कॉल नहीं किया जाएगा। लेकिन अगर कॉल किया जाता है, तो क्या कंपाइलर अभी भी बैकट्रैक करेगा और true
मानों के संयोजन के पूरे समूह को निष्पादित करेगा? या यह इस अनावश्यक कदम को दूर करेगा?क्या निम्न फ़ंक्शन पूंछ रिकर्सिव है?
दूसरे शब्दों में, निम्न कार्य प्रभावी ढंग से पूंछ रिकर्सिव है?
let isExtensionOf<'A when 'A : equality> (lst1 : list<'A>) (lst2 : list<'A>) : bool =
let rec helper (currLst1 : list<'A>) (currLst2 : list<'A>) : bool =
match currLst1, currLst2 with
| h1 :: _, [] -> false
| [], _ -> true
| h1 :: t1, h2 :: t2 -> (h1 = h2) && (helper t1 t2) // *
helper lst1 lst2
हाँ, मुझे पता है कि तारांकित लाइन if h1 = h2 then helper t1 t2 else false
लिखा जाना चाहिए। लेकिन मैं सिर्फ उत्सुक हूँ।
अग्रिम धन्यवाद।
सबसे आसान तरीका सवालों के इन प्रकार का जवाब देने के: एक विशाल सूची है जो आपको लगता है रोग व्यवहार को गति प्रदान और देखो क्या होता होगा में फ़ीड। –
मैं इसे संकलित करना चाहता हूं और फिर ILSpy के साथ परिणामी कोड को देखता हूं। अधिक भरोसेमंद। यह भी ध्यान रखें कि परिणाम अनुकूलन सक्षम हैं या नहीं, इस पर निर्भर करता है। –
वैसे, यह एक पलक बल्लेबाजी किए बिना कार्डिनिटी '1,00,000,000' (एक सौ मिलियन) की सूचियों को संभाला, इसलिए मैं मानता हूं कि मेरे प्रश्न का उत्तर सकारात्मक में दिया जा सकता है। – Shredderroy