पुनरावृत्ति को दूर करना - पर्दे के पीछे सिद्धांत में एक नज़र


10

मैं इस साइट के लिए नया हूं और यह सवाल निश्चित रूप से अनुसंधान स्तर नहीं है - लेकिन अच्छी तरह से। मेरे पास सॉफ्टवेयर इंजीनियरिंग में थोड़ी पृष्ठभूमि है और लगभग CSTheory में कोई भी नहीं है, लेकिन मुझे यह आकर्षक लगता है। एक लंबी कहानी को छोटा करने के लिए, मैं निम्नलिखित का अधिक विस्तृत उत्तर चाहूंगा यदि यह प्रश्न इस साइट पर स्वीकार्य है।

इसलिए, मुझे पता है कि हर पुनरावर्ती कार्यक्रम में एक पुनरावृत्त एनालॉग होता है और मैं उस लोकप्रिय स्पष्टीकरण को समझता हूं जो "सिस्टम स्टैक" के समान कुछ बनाए रखने और रिटर्न एड्रेस आदि जैसे पर्यावरण सेटिंग्स को आगे बढ़ाने के द्वारा पेश किया जाता है। ।

थोड़ा और ठोस होने के नाते, मैं (औपचारिक रूप से) यह देखना चाहता हूं कि कोई ऐसे मामलों में यह कैसे साबित करता है, जहां आपके पास एक फ़ंक्शन चेन चेन । इसके अलावा, क्या होगा अगर कुछ सशर्त बयान हैं जो नेतृत्व कर सकते हैं कुछ को कॉल करें ? यही है, संभावित फ़ंक्शन कॉल ग्राफ़ में कुछ दृढ़ता से जुड़े घटक हैं।एफ0एफ1...एफमैंएफमैं+1...एफnएफ0एफमैंएफजे

मैं जानना चाहता हूं कि इन स्थितियों को कैसे संभाला जा सकता है ताकि हम पुनरावर्ती कनवर्टर को कुछ पुनरावर्ती कहें। और क्या इस समस्या के लिए मैं पहले बताए गए हाथ का वर्णन कर रहा हूं, वास्तव में काफी है? मेरा मतलब है कि ऐसा क्यों है कि मुझे कुछ मामलों में पुनरावर्तन को आसान लगता है। विशेष रूप से एक बाइनरी ट्री के प्री-ऑर्डर ट्रैवर्सल से पुनरावृत्ति को हटाना वास्तव में आसान है - इसका एक मानक साक्षात्कार प्रश्न लेकिन पोस्ट ऑर्डर के मामले में पुनर्संरचना को हटाना हमेशा मेरे लिए एक बुरा सपना रहा है।

मैं वास्तव में क्या पूछ रहा हूँ प्रश्न हैं2

(१) क्या वास्तव में अधिक औपचारिक (पुष्टिकरण?) प्रमाण है कि पुनरावृत्ति को पुनरावृति में परिवर्तित किया जा सकता है?

(२) यदि यह थ्योरी वास्तव में वहाँ है, तो ऐसा क्यों है कि मुझे लगता है, उदाहरण के लिए, प्रीऑर्डर को आसान करना और पोस्टऑर्डर को इतनी मेहनत करना? (मेरी सीमित बुद्धि के अलावा)


1
शब्द iteratizing की तरह :)
आकाश कुमार

मुझे यकीन नहीं है कि अगर मैं पूरी तरह से समझता हूं, लेकिन यदि पुनरावृत्ति कहीं खत्म हो जाती है, तो आप वास्तव में अपने स्वयं के स्टैक का उपयोग करके सिस्टम स्टैक का अनुकरण कर सकते हैं। भाग (2) के लिए, कम्प्यूटेशनल जटिलता के संदर्भ में समस्याएं अलग नहीं हैं।
सिंहसुमित

मुझे लगता है कि यह प्रश्न कंप्यूटर विज्ञान साइट के लिए सबसे उपयुक्त होगा जो अभी तक लाइव नहीं है। अपने दूसरे प्रश्न के रूप में, क्या आप सोच सकते हैं कि आपको क्यों लगता है कि यह कठिन है? प्रक्रिया लगभग समान होनी चाहिए।
राफेल

आपकी टिप्पणियों के लिए सभी को धन्यवाद - मुझे लगता है कि मुझे कुछ पढ़ने को मिला है।
इताची उचिहा

@ राफेल - मेरे बारे में एक टिप्पणी है कि मुझे क्यों लगता है कि पोस्टऑर्डर करना कठिन है (इसके अलावा मैं इसे करने में सक्षम नहीं हूं)। मैं पुनरावृत्ति को हटाने पर कुछ लेख पढ़ रहा था और पूंछ पुनरावर्ती कार्यों नामक कुछ में भाग गया। पता चलता है कि वे इसे पुनरावृत्त करना आसान है। मुझे अभी भी औपचारिक रूप से समझ नहीं आया कि यह सच क्यों है; लेकिन एक और चीज है जिसे मुझे जोड़ना चाहिए। मैंने सुना है कि iteratizing पोस्टऑर्डर को दो स्टैक की आवश्यकता होती है और एक नहीं बल्कि विवरण नहीं जानते हैं। और अब मैं खो गया हूं - इन दो ट्रैवर्सल मोड के बीच अंतर क्यों? और पूंछ पुनरावृत्ति को संभालना आसान क्यों है?
इटाची उचिहा

जवाबों:


6

अगर मैं सही तरीके से समझूं, तो आप उन फ़ंक्शन को परिवर्तित करने के बारे में स्पष्ट हैं जिनमें कोई अन्य फ़ंक्शन कॉल नहीं है, लेकिन स्वयं के लिए।

तो मान लें कि हमारे पास "कॉल चेन" । अगर हम आगे मानते हैं कि स्वयं को पुनरावर्ती नहीं कर रहे हैं (क्योंकि हमने उन्हें पहले ही परिवर्तित कर दिया है), हम उन सभी कॉल को की परिभाषा में इनलाइन कर सकते हैं जो इस प्रकार सीधे पुनरावर्ती कार्य बन जाते हैं जिनसे हम पहले ही निपट सकते हैं।एफएफ1एफnएफएफ1,...,एफnएफ

यह विफल रहता है कुछ अपने आप में एक पुनरावर्ती कॉल श्रृंखला जिसमें है होता है, यानी । इस मामले में, हमारे पास पारस्परिक पुनरावृत्ति है जिससे छुटकारा पाने के लिए एक और चाल की आवश्यकता है। विचार एक साथ दोनों कार्यों की गणना करना है। उदाहरण के लिए, तुच्छ मामले में:एफजेएफएफजेएफएफजे

f(0) = a
f(n) = f'(g(n-1))

g(0) = b
g(n) = g'(f(n-1))

के साथ f'और g'गैर-पुनरावर्ती कार्य (या कम से कम स्वतंत्र fऔर g) हो जाता है

h(0) = (a,b)
h(n) = let (f,g) = h(n-1) in (f'(g), g'(f)) end

f(n) = let (f, _) = h(n) in f end
g(n) = let (_, g) = h(n) in g end

यह स्वाभाविक रूप से शामिल अधिक कार्यों और अधिक जटिल कार्यों तक फैला हुआ है।


मैं खुशी से मदद कर सकता है। कृपया बगल में स्थित चेकमार्क पर क्लिक करके अपने पसंदीदा उत्तर को स्वीकार करना न भूलें।
राफेल

1
राफेल, आपकी चाल तभी काम करती है जब दोनों पुनरावर्ती कार्य एक ही प्रकार के तर्क स्वीकार करते हैं। यदि विभिन्न प्रकारों को स्वीकार fऔर gस्वीकार किया जाता है, तो अधिक सामान्य चाल की आवश्यकता होती है।
बाउर

@AndrejBauer अच्छा अवलोकन, मैं पूरी तरह से याद किया। मैं वास्तव में राफेल के दृष्टिकोण को पसंद करता था, लेकिन जैसा कि आप सामान्य मामलों में देखते हैं, हमें शायद कुछ अलग विचार की आवश्यकता है। क्या आप कोई अन्य सुझाव दे सकते हैं?
इताची उचिहा

fgn-1n-2

खैर, यह कैसे करना है पर मेरा जवाब देखें।
बाउर

8

हां, यह मानने के ठोस कारण हैं कि पुनरावृत्ति को पुनरावृत्ति में बदला जा सकता है। यह हर संकलक तब करता है जब यह स्रोत कोड को मशीनी भाषा में अनुवाद करता है। सिद्धांत के लिए आपको डेव क्लार्क के सुझावों का पालन करना चाहिए। यदि आप वास्तविक कोड को देखना चाहते हैं जो पुनरावृत्ति को गैर-पुनरावर्ती कोड में परिवर्तित करता है, तो machine.mlमेरे PL चिड़ियाघर में मिनीएमएल भाषा में एक नज़र डालें (ध्यान दें कि loopतल पर फ़ंक्शन, जो वास्तव में कोड चलाता है, पूंछ पुनरावर्ती है और इसलिए यह है) तुच्छ रूप से एक वास्तविक लूप में परिवर्तित हो)।

एक और चीज़। MiniML पारस्परिक रूप से पुनरावर्ती कार्यों का समर्थन नहीं करता है। लेकिन यह कोई समस्या नहीं है। यदि आप कार्यों के बीच पारस्परिक पुनरावृत्ति है

1:1बी1
2:2बी2
n:nबीn

पुनरावर्ती को एकल पुनरावर्ती मानचित्र के रूप में व्यक्त किया जा सकता है

:1++nबी1++बीn,

8

आप SECD मशीन को देखना चाह सकते हैं । एक कार्यात्मक भाषा (हालांकि यह किसी भी भाषा हो सकती है) का अनुवाद उन निर्देशों की एक श्रृंखला में किया जाता है, जो स्टैक की दलीलें रखने, नए कार्यों और "आगे", सभी को एक साधारण लूप द्वारा प्रबंधित करने जैसी चीजों का प्रबंधन करती हैं।
पुनरावर्ती कॉल वास्तव में कभी लागू नहीं होते हैं। इसके बजाय, कहा जा रहा है कि निकाय के निर्देशों को चलाने के लिए स्टैक पर रखा गया है।

एक संबंधित दृष्टिकोण CEK मशीन है

ये दोनों लंबे समय से आस-पास हैं, इसलिए इन पर काफी काम हो रहा है। और निश्चित रूप से सबूत हैं कि वे काम करते हैं और एसईसीडी निर्देशों में एक कार्यक्रम को "संकलन" करने की प्रक्रिया कार्यक्रम के आकार में रैखिक है (इसे कार्यक्रम के बारे में सोचने की ज़रूरत नहीं है)।

मेरे उत्तर की बात यह है कि आप जो चाहते हैं, उसके लिए एक स्वचालित प्रक्रिया है। दुर्भाग्य से, परिवर्तन आवश्यक रूप से उन चीजों के संदर्भ में नहीं होगा जो प्रोग्रामर के लिए व्याख्या करने के लिए तुरंत आसान हैं। मुझे लगता है कि कुंजी यह है कि जब आप किसी प्रोग्राम को पुनरावृत्त करना चाहते हैं, तो आपको स्टैक पर स्टोर करने की आवश्यकता है कि जब आप एक iterized फ़ंक्शन कॉल से लौटते हैं तो प्रोग्राम को क्या करने की आवश्यकता है (इसे एक निरंतरता कहा जाता है)। कुछ कार्यों (जैसे पूंछ-पुनरावर्ती कार्य) के लिए निरंतरता तुच्छ है। दूसरों के लिए निरंतरता शायद बहुत जटिल है, खासकर यदि आपको इसे स्वयं को एनकोड करना है।


मैं यहाँ ईमानदार रहूँगा मैं वास्तव में समझना चाहता हूं कि क्यों (और कैसे) आप हर पुनरावर्ती कार्यक्रम को पुनरावृत्त कर सकते हैं। लेकिन मुझे एक पेपर के माध्यम से पढ़ना मुश्किल लगता है - वे आमतौर पर मेरे लिए सुलभ नहीं हैं। मेरा मतलब है कि मैं सवाल में बात की "handwavy" विवरण की तुलना में एक गहरा कारण चाहता हूं। लेकिन मैं भी जो मुझे कुछ नए अंतर्दृष्टि देता है कुछ के साथ खुश हूँ - यह अपने वास्ते विवरण में पूरे सबूत होने की जरूरत नहीं है
इताची उचिहा

[cntd] मेरा मतलब है कि मुझे सबूत पसंद आएगा, अगर कोई है, तो मुझे यह बताने के लिए कि एक प्रोग्राम को दूसरे की तुलना में आसान क्यों बनाना है। लेकिन कुछ अर्थों में, पुनरावृत्त कनवर्टर के पुनरावर्ती को किसी भी तरह से काम नहीं करना चाहिए जो पुनरावर्ती कार्यक्रम को इनपुट के रूप में लेता है। Nt यकीन है, लेकिन मुझे लगता है कि इस तरह के एक कनवर्टर बनाने sth समस्या के रूप में के रूप में मुश्किल हो सकता है? मैं यहां केवल अनुमान लगा रहा हूं - लेकिन मैं पुनरावृत्ति से संबंधित होने के लिए पुनरावृत्त कनवर्टर से प्यार करता हूं और अगर ऐसा होता है तो मैं इसे पुनरावर्ती कार्यक्रमों की पुनरावृत्ति की अंतर्निहित जटिलता की व्याख्या करना चाहूंगा। मुझे यकीन नहीं है, लेकिन क्या मुझे इस सवाल को संपादित करना चाहिए? क्या मेरा प्रश्न स्पष्ट है?
इताची उचिहा

@ इताचीउचिहा - मुझे नहीं लगता कि आपकी समस्या असंदिग्ध है। बीफ बाउर के उत्तर को देखें। वह नोट करता है कि हर कंपाइलर ऐसा करता है जब वह स्रोत कोड को मशीनी भाषा में अनुवाद करता है। इसके अलावा वह जोड़ता है कि आप वास्तविक कोड को पुनरावृत्ति को गैर-पुनरावर्ती को मिनीएम (ए) एल भाषा में परिवर्तित कर सकते हैं। यह स्पष्ट रूप से इंगित करता है कि "पुनरावृत्ति" पुनरावृत्ति के लिए एक निर्णय प्रक्रिया है। मैं पुनरावृत्ति को दूर करने की अंतर्निहित (वैचारिक) कठिनाई / जटिलता के बारे में निश्चित नहीं हूं। मैं इस प्रश्न को बहुत स्पष्ट रूप से नहीं समझता हूं लेकिन यह दिलचस्प लग रहा है। हो सकता है कि आप बेहतर उत्तर पाने के लिए अपने प्रश्न को संपादित कर सकते हैं
आकाश कुमार

मेरे उत्तर की बात यह है कि आप जो चाहते हैं, उसके लिए एक स्वचालित प्रक्रिया है। दुर्भाग्य से, परिवर्तन आवश्यक रूप से उन चीजों के संदर्भ में नहीं होगा जो प्रोग्रामर के लिए व्याख्या करने के लिए तुरंत आसान हैं। मुझे लगता है कि कुंजी यह है कि जब आप किसी प्रोग्राम को पुनरावृत्त करना चाहते हैं, तो आपको स्टैक पर स्टोर करने की आवश्यकता है कि जब आप एक iterized फ़ंक्शन कॉल से वापस आते हैं तो प्रोग्राम को क्या करने की आवश्यकता है (इसे एक निरंतरता कहा जाता है)। कुछ कार्यों (जैसे पूंछ-पुनरावर्ती कार्य) के लिए निरंतरता तुच्छ है। दूसरों के लिए निरंतरता शायद बहुत जटिल है, खासकर यदि आपको इसे स्वयं को एनकोड करना है।
डेव क्लार्क

6

प्रश्न : "क्या वास्तव में एक अधिक औपचारिक (ठोस?) सबूत है कि पुनरावृत्ति को पुनरावृत्ति में परिवर्तित किया जा सकता है?"

A : ट्यूरिंग मशीन की ट्यूरिंग पूर्णता :-)

जोक्स के अलावा, ट्यूरिंग रैंडम एक्सेस स्टोरेज प्रोग्राम (आरएएसपी) मशीन मॉडल असली माइक्रोप्रोसेसरों के काम करने के करीब है और इसके निर्देश सेट में केवल सशर्त कूद (कोई पुनरावृत्ति) नहीं है। कोड को डायनामिक रूप से स्व-संशोधित करने की संभावना सबरूटिन और पुनरावर्ती कॉल को लागू करने के कार्य को आसान बनाती है।

मुझे लगता है कि आप "पर कई कागजात / लेख पा सकते हैं पुनरावृत्ति रूपांतरण के लिए पुनरावर्ती " (डेव जवाब देखने के लिए या सिर्फ गूगल कीवर्ड्स), लेकिन शायद एक कम ज्ञात (और व्यावहारिक ) दृष्टिकोण पर नवीनतम अनुसंधान है पुनरावर्ती एल्गोरिदम के हार्डवेयर कार्यान्वयन ( VHDL भाषा का उपयोग करना जो सीधे हार्डवेयर के एक टुकड़े में "संकलित" है। उदाहरण के लिए देखें V.klyarov के पेपर " पुनरावर्ती एल्गोरिदम का FPGA- आधारित कार्यान्वयन " ( पेपर हार्डवेयर में पुनरावर्ती एल्गोरिदम को लागू करने के लिए एक उपन्यास विधि का सुझाव देता है। .... डेटा सॉर्टिंग और संपीड़न क्षेत्र में पुनरावर्ती एल्गोरिदम के दो व्यावहारिक अनुप्रयोगों का अध्ययन किया गया है। विस्तार से .... )।


1

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

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


0

मेरी राय में यह प्रश्न गणना की परिभाषाओं की बहुत उत्पत्ति के लिए वापस जाता है और बहुत पहले उस समय के आसपास कड़ाई से साबित हुआ था जब चर्च लैम्ब्डा कैलकुलस (जो पुनरावृत्ति की अवधारणा को अत्यधिक पकड़ लेता है) को ट्यूरिंग मशीनों के बराबर दिखाया गया था, और इसमें समाहित है अभी भी प्रयुक्त शब्दावली "पुनरावर्ती भाषा / कार्य" में। जाहिर है इन लाइनों के साथ बाद में एक प्रमुख रेफरी निम्नानुसार है

जैसा कि पीटर लैंडिन के 1965 के पेपर ए कॉरस्पॉन्डेंस इन एएलजीओएल 60 और चर्च के लैंबडा-नोटेशन के बीच बताया गया है, क्रमिक प्रक्रियात्मक प्रोग्रामिंग भाषाओं को लैम्ब्डा कैलकुलस के संदर्भ में समझा जा सकता है, जो प्रक्रियात्मक अमूर्त और प्रक्रिया (उपप्रोग्राम) आवेदन के लिए बुनियादी तंत्र प्रदान करता है।

इस पर बहुत bkd इस विकिपीडिया पृष्ठ चर्च-ट्यूरिंग थीसिस में है । सटीक बारीकियों के बारे में निश्चित नहीं हूं, लेकिन विकिपीडिया लेख से लगता है कि यह रोसेर (1939) था, जिसने 1 लैम्ब्डा कैलकुलस और ट्यूरिंग मशीनों के बीच इस समानता को साबित किया था। शायद / संभवतः उसके कागज में टीएम निर्माण के लिए (संभवतः पुनरावर्ती) लंबो कॉल को परिवर्तित करने के लिए एक स्टैक जैसा तंत्र है?

रोसेर, जेबी (1939)। "गोडेल के प्रमेय और चर्च के प्रमेय के सबूतों का एक अनौपचारिक विस्तार"। द जर्नल ऑफ़ सिंबोलिक लॉजिक (द जर्नल ऑफ़ सिंबोलिक लॉजिक, वॉल्यूम 4, नंबर 2) 4 (2): 53-60। डोई: 10.2307 / 2,269,059। JSTOR 2269059।

आधुनिक लिस्प भाषा और वैरिएंट स्कीम के सिद्धांतों में दिलचस्पी रखने वाले किसी भी व्यक्ति के लिए पाठ्यक्रम का नोट जानबूझकर लैम्ब्डा कैलकुलस के लिए एक मजबूत समानता है। अभिव्यक्ति के मूल्यांकन के लिए दुभाषिया कोड का अध्ययन उन विचारों की ओर जाता है जो मूल रूप से लैम्ब्डा कैलकुलस की ट्यूरिंग पूर्णता के लिए कागजों में निहित थे।


1
ट्यूरिंग / लैम्ब्डा समतुल्यता प्रमाण इस पेपर के परिशिष्ट में है: www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf
Radu GRIGore
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.