आपके एल्गोरिथ्म का आपका वर्णन इस बिंदु पर मूल्यांकन करने के लिए वास्तव में बहुत अस्पष्ट है। लेकिन, यहां कुछ बातों पर विचार करना होगा।
सीपीएस
वास्तव में, किसी भी कोड को एक रूप में बदलने का एक तरीका है जो केवल पूंछ-कॉल का उपयोग करता है। यह सीपीएस परिवर्तन है। सीपीएस ( कंटीन्यूएशन-पासिंग स्टाइल ) प्रत्येक फ़ंक्शन को एक निरंतरता देकर कोड व्यक्त करने का एक रूप है। एक निरंतरता एक सार धारणा है जो "बाकी के एक संकलन" का प्रतिनिधित्व करती है। सीपीएस फॉर्म में व्यक्त कोड में, निरंतरता को पुन: प्राप्त करने का प्राकृतिक तरीका एक फ़ंक्शन के रूप में है जो एक मूल्य को स्वीकार करता है। सीपीएस में, मान को वापस करने वाले फ़ंक्शन के बजाय, यह फ़ंक्शन द्वारा वर्तमान निरंतरता का प्रतिनिधित्व "रिटर्न" करने के लिए फ़ंक्शन को लागू करता है।
उदाहरण के लिए, निम्नलिखित फ़ंक्शन पर विचार करें:
(lambda (a b c d)
(+ (- a b) (* c d)))
इसे सीपीएस में इस प्रकार व्यक्त किया जा सकता है:
(lambda (k a b c d)
(- (lambda (v1)
(* (lambda (v2)
(+ k v1 v2))
a b))
c d))
यह बदसूरत है, और अक्सर धीमा है, लेकिन इसके कुछ फायदे हैं:
- परिवर्तन पूरी तरह से स्वचालित हो सकता है। इसलिए सीपीएस फॉर्म में कोड लिखने (या देखने) की कोई आवश्यकता नहीं है।
- थंकिंग और ट्रैम्पोलिनिंग के साथ संयुक्त , इसका उपयोग उन भाषाओं में टेल-कॉल ऑप्टिमाइज़ेशन प्रदान करने के लिए किया जा सकता है जो टेल-कॉल ऑप्टिमाइज़ेशन प्रदान नहीं करते हैं। (सीधे पूंछ-पुनरावर्ती कार्यों के टेल-कॉल अनुकूलन को अन्य साधनों के माध्यम से पूरा किया जा सकता है, जैसे कि पुनरावर्ती कॉल को लूप में बदलना। लेकिन अप्रत्यक्ष पुनरावृत्ति इस तरीके से परिवर्तित करने के लिए तुच्छ नहीं है।)
- सीपीएस के साथ, निरंतरता एक प्रथम श्रेणी की वस्तु बन जाती है। चूंकि निरंतरता नियंत्रण का सार है, यह लगभग किसी भी नियंत्रण ऑपरेटर को भाषा के किसी विशेष समर्थन की आवश्यकता के बिना पुस्तकालय के रूप में कार्यान्वित करने में सक्षम बनाता है। उदाहरण के लिए, गोटो, अपवाद और सहकारी सूत्रण सभी को निरंतरता का उपयोग करके बनाया जा सकता है।
TCO
यह मुझे लगता है कि पूंछ-पुनरावृत्ति (या सामान्य रूप से टेल-कॉल) से संबंधित होने का एकमात्र कारण पूंछ-कॉल अनुकूलन (TCO) के प्रयोजनों के लिए है। इसलिए मुझे लगता है कि पूछने के लिए एक बेहतर प्रश्न है "क्या मेरा परिवर्तन उपज कोड है जो पूंछ-कॉल अनुकूलन है?"।
यदि हम एक बार फिर सीपीएस पर विचार करते हैं, तो इसकी एक विशेषता यह है कि सीपीएस में व्यक्त कोड में केवल टेल-कॉल होते हैं। चूंकि सब कुछ एक पूंछ-कॉल है, इसलिए हमें स्टैक पर एक रिटर्न-पॉइंट बचाने की आवश्यकता नहीं है। तो सीपीएस फॉर्म में सभी कोड टेल-कॉल को अनुकूलित करना चाहिए , है ना?
खैर, बिल्कुल नहीं। आप देखते हैं, जबकि ऐसा प्रतीत हो सकता है कि हमने स्टैक को समाप्त कर दिया है, हमने जो कुछ भी किया है वह केवल हमारे द्वारा प्रतिनिधित्व करने के तरीके को बदलना है। स्टैक अब बंद का हिस्सा है जो एक निरंतरता का प्रतिनिधित्व करता है। इसलिए CPS जादुई रूप से हमारे सभी कोड टेल-कॉल को अनुकूलित नहीं बनाता है।
इसलिए यदि CPS सब कुछ TCO नहीं कर सकता है, तो क्या विशेष रूप से प्रत्यक्ष पुनरावृत्ति के लिए एक परिवर्तन है? नहीं, सामान्य तौर पर नहीं। कुछ पुनरावर्ती रेखीय हैं, लेकिन कुछ नहीं हैं। गैर-रैखिक (जैसे, पेड़) की पुनरावृत्ति बस कहीं न कहीं राज्य की एक चर राशि बनाए रखना चाहिए ।