2012-12-18 27 views
8

उदाहरण के लिए, चूंकि निम्न फ़ंक्शन में संचयक नहीं है, क्या यह अभी भी पूंछ रिकर्सिव है?क्या पूंछ रिकर्सन को एक संचयक की आवश्यकता है?

belong:: (Ord a) => a -> [a] -> Bool 
belong a [] = False 
belong a (h:t) 
    | a == h = True 
    | otherwise = belong a t 

समारोह के सभी संगणना पुनरावर्ती कॉल करने से पहले कार्रवाई की जाती है, यह एक पर्याप्त शर्त पूंछ पुनरावर्ती पर विचार किया जाना है?

+1

हाँ, यह पर्याप्त है – m09

+0

पूंछ रिकर्स सख्त भाषाओं में सबसे अच्छा है, लेकिन हास्केल में, चीजें थोड़ा अलग हैं। [यह सवाल] (http://stackoverflow.com/questions/13042353/does-haskell-have-tail-recursive-optimization) इस मुद्दे पर अच्छी जानकारी प्राप्त करता है। – AndrewC

उत्तर

10

पूंछ रिकर्सन को एक संचयक की आवश्यकता नहीं है। रिक्यूर्सिव कॉल श्रृंखला के माध्यम से आंशिक परिणाम को संप्रेषित करने के तरीके के रूप में समेकनकर्ताओं का उपयोग पूंछ के प्रत्येक स्तर पर अतिरिक्त स्थान की आवश्यकता के बिना किया जाता है। उदाहरण के लिए, कैननिकल पूंछ रिकर्सिव फैक्टोरियल फ़ंक्शन को अब तक बनाए गए आंशिक उत्पाद को प्रसारित करने के लिए एक संचयक की आवश्यकता होती है। हालांकि, अगर आपको रिकर्सिव कॉल से किसी भी जानकारी को अपने सबकॉल में संवाद करने की आवश्यकता नहीं है, तो जमाकर्ता आवश्यक नहीं है।

आपके द्वारा प्रदान किया गया कार्य वास्तव में पूंछ रिकर्सिव है, लेकिन इसे एक संचयक की आवश्यकता या उपयोग करने की आवश्यकता नहीं है। किसी सूची में किसी तत्व की खोज करते समय, रिकर्सन को यह याद रखने की आवश्यकता नहीं है कि अब तक जिन सभी तत्वों को देखा गया है, वे उस विशेष तत्व के बराबर नहीं हैं जो खोजा जा रहा है। यह सिर्फ यह जानने की जरूरत है कि किस तत्व को देखना है और खोज करने की क्या सूची है।

आशा है कि इससे मदद मिलती है!

+0

बहुत मदद की! अच्छा स्पष्टीकरण। – user1493813

0

Tail recursion आवश्यक रूप से एक संचयक की आवश्यकता नहीं है। हालांकि, एक संचयक अक्सर प्रयोग किया जाता है। संकेत, "accumulator" के लिए विकिपीडिया लेख खोजें।