पुनरावृत्ति की जगह ले सकता है Iteration?


42

मैं सभी स्टैक ओवरफ्लो को देख रहा हूं, जैसे यहां , यहां , यहां , यहां , यहां और कुछ अन्य जिन्हें मैं उल्लेख करने की परवाह नहीं करता हूं, कि "कोई भी प्रोग्राम जो पुनरावृत्ति का उपयोग करता है, उसे केवल पुनरावृत्ति का उपयोग करके प्रोग्राम में परिवर्तित किया जा सकता है"।

यहाँ तक कि अत्यधिक उत्कीर्ण उत्तर के साथ एक उच्च उत्कीर्ण धागा भी था, जिसने कहा कि हाँ यह संभव है।

अब मैं यह नहीं कह रहा कि वे गलत हैं। यह सिर्फ इतना है कि उत्तर मेरे कंप्यूटिंग ज्ञान और कंप्यूटिंग के बारे में समझ को काउंटर करता है।

मेरा मानना ​​है कि प्रत्येक पुनरावृत्त समारोह को पुनरावृत्ति के रूप में व्यक्त किया जा सकता है, और विकिपीडिया के पास उस प्रभाव का एक बयान है। हालांकि, मुझे संदेह है कि काफिला सच है। एक के लिए, मुझे संदेह है कि गैर-आदिम पुनरावर्ती कार्यों को चलने के लिए व्यक्त किया जा सकता है।

मुझे यह भी संदेह है कि हाइपर-ऑपरेशंस को इसे जाहिर किया जा सकता है।

उसकी में जवाब (जो मैं जिस तरह से समझ में नहीं आता) मेरे लिए सवाल @YuvalFIlmus ने कहा कि यह अतिरिक्त के अनुक्रम में गणितीय क्रियाओं के किसी भी क्रम में परिवर्तित करने के लिए संभव नहीं है।

यदि YF का उत्तर वास्तव में सही है (मुझे लगता है कि यह है, लेकिन उसका तर्क मेरे सिर के ऊपर था) तो इसका मतलब यह नहीं है कि हर पुनरावृत्ति को पुनरावृत्ति में नहीं बदला जा सकता है? क्योंकि यदि प्रत्येक पुनरावृत्ति को पुनरावृति में परिवर्तित करना संभव था, तो मैं सभी परिचालनों को जोड़ के अनुक्रम के रूप में व्यक्त कर सकूंगा।

मेरा सवाल यह है:

क्या हर पुनरावृत्ति को पुनरावृत्ति में बदला जा सकता है और क्यों?

कृपया एक उत्तर दें एक उज्ज्वल हाईस्कूलर या पहले वर्ष के अंडरग्रेजुएट समझ जाएगा। धन्यवाद।

पुनश्च मैं नहीं जानता कि आदिम पुनरावर्ती क्या है (मैं एकरमन फ़ंक्शन के बारे में जानता हूं, और यह कि यह आदिम पुनरावर्ती नहीं है, लेकिन अभी भी गणना योग्य है। इस पर मेरे ज्ञान को Ackermann फ़ंक्शन पर विकिपीडिया पृष्ठ से आता है।)

PPS: यदि उत्तर हां है, तो क्या आप उदाहरण के लिए एक गैर-आदिम-पुनरावर्ती फ़ंक्शन का पुनरावृत्त संस्करण लिख सकते हैं। जैसे उत्तर में एकरमैन। यह मुझे समझने में मदद करेगा।


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

6
निम्न स्तर पर हम में से अधिकांश जानते हैं कि पुनरावृत्ति पुनरावृत्ति प्लस स्टैक के बराबर है। प्रसंग-मुक्त व्याकरण मॉडल पुनरावृत्ति, जबकि पुशडाउन ऑटोमेटा स्टैक मेमोरी के साथ चलने वाले "प्रोग्राम" हैं।
हेंड्रिक जनवरी

2
केवल यह इंगित करते हुए कि आम तौर पर यह देखने के लिए कम से कम 24 घंटे इंतजार करना एक अच्छा विचार है कि क्या अन्य उत्तर पॉप अप करते हैं। स्वीकृत प्रश्न मेरे लिए बहुत अधिक लंबा और जटिल है, स्पष्ट रूप से, और जानबूझकर आवश्यक से अधिक मामलों को जटिल लगता है। आपके प्रश्न का मूल उत्तर है "पुनरावृत्ति के लिए उपयोग किया जाने वाला स्टैक का उपयोग एक पुनरावृत्त तरीके से किया जा सकता है", और इससे अधिक जटिल होने की आवश्यकता नहीं है। स्मृति के बारे में विचार निर्विवाद है या नहीं चल रहा है क्योंकि रिकर्सियन स्टैक के लिए यह सुविधा आवश्यक है, वैसे भी।
AnoE

ट्यूरिंग मशीन एमुलेटर को केवल पुनरावृत्ति के साथ लागू करना संभव है
सर्ज बोर्स्च

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

जवाबों:


52

पुनरावृत्ति को अनबाउंड मेमोरी से पुनरावृत्ति को बदलना संभव है ।

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

अनबाउंड मेमोरी होने से सौदा बदल जाता है। यह अनबाउंड मेमोरी कई रूपों को ले सकती है जो बराबर अभिव्यंजक शक्ति के लिए निकलते हैं। उदाहरण के लिए, एक ट्यूरिंग मशीन इसे सरल रखती है: एक ही टेप है, और कंप्यूटर केवल एक बार में एक कदम से टेप पर आगे या पीछे की ओर बढ़ सकता है - लेकिन यह कुछ भी करने के लिए पर्याप्त है जो आप पुनरावर्ती कार्यों के साथ कर सकते हैं।

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

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

अब मान लीजिए कि आप कंप्यूटर के साथ एक पुनरावर्ती अभिकलन का अनुकरण करना चाहते हैं। पुनरावर्ती कार्यों को निष्पादित करने की तकनीक अच्छी तरह से ज्ञात है: प्रत्येक फ़ंक्शन कॉल में मेमोरी का एक टुकड़ा होता है, जिसे स्टैक फ्रेम कहा जाता है । महत्वपूर्ण रूप से, पुनरावर्ती कार्यों के आसपास चर चर द्वारा कई कॉल के माध्यम से जानकारी का प्रचार कर सकते हैं। कंप्यूटर पर कार्यान्वयन के संदर्भ में, इसका मतलब है कि एक फ़ंक्शन कॉल एक (भव्य-) * मूल कॉल के स्टैक फ्रेम तक पहुंच सकता है ।

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

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

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

forwhilen


विस्तृत विवरण के लिए स्वीकार करना, अनुरोधित स्तर पर रखा गया।
तोबी अलाफिन

12
मुझे लगता है कि यह असली कंप्यूटर की तुलना में ध्यान देने योग्य है, पुनरावृत्ति भी मेमोरी (बढ़ती कॉल स्टैक) का उपयोग करती है। तो व्यावहारिक अनुप्रयोगों में, अनबाउंड मेमोरी की आवश्यकता नहीं है (क्योंकि सब कुछ समान रूप से बाध्य है)। और पुनरावृत्ति को अक्सर पुनरावृत्ति की तुलना में अधिक स्मृति की आवश्यकता होती है।
Agent_L

@Agent_L हाँ, सभी स्टैक फ़्रेम को संग्रहीत करने के लिए पुनर्संरचना को अनबाउंड मेमोरी की आवश्यकता होती है। पुनरावृत्ति दृष्टिकोण के साथ, अनबाउंड मेमोरी की आवश्यकता होती है, लेकिन पुनरावृत्तियों के साथ संचालन की अनुक्रमण से यह सहज रूप से अलग नहीं है।
गिल्स एसओ- बुराई का होना बंद करें '

1
शायद ब्याज की चर्च-ट्यूरिंग थीसिस होगी। ट्यूरिंग मशीनें पुनरावृत्ति की अवधारणा (अंतर्निहित) नहीं के साथ अत्यधिक चलने वाली मशीनें हैं। लैम्बडा कलन एक पुनरावर्ती तरीके से गणना व्यक्त करने के लिए तैयार की गई भाषा है। चर्च-ट्यूरिंग थीसिस से पता चला है कि सभी लैम्ब्डा अभिव्यक्तियों का मूल्यांकन ट्यूरिंग मशीन पर किया जा सकता है, जो पुनरावृत्ति और पुनरावृत्ति को जोड़ता है।
Cort Ammon

1
@BlackVegetable यदि एक पुनरावर्ती विधि में कोई आंतरिक चर नहीं है, और इसका उपयोग करने वाली एकमात्र मेमोरी कॉल स्टैक है (जिसे TCO द्वारा अनुकूलित किया जा सकता है), तो यह पुनरावृत्त संस्करण सबसे अधिक संभावना है कि कोई आंतरिक चर नहीं है और केवल निरंतर मेमोरी का उपयोग करें ( चर) काउंटर की तरह सभी पुनरावृत्तियों में साझा किए गए।
Agent_L

33

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

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


25

a(n,m)

s

push(s,x)xxpop(s)empty(s)

Ackermann(n0,m0):

  • s= (आरंभिक खाली स्टैक)
  • push(s,n0)
  • push(s,m0)
  • while(true):
    • mpop(s)
    • if(empty(s)):
      • return m (यह लूप को समाप्त करता है)
    • npop(s)
    • if(n=0):
      • push(s,m+1)
    • else if(m=0):
      • push(s,n1)
      • push(s,1)
    • else:
      • push(s,n1)
      • push(s,n)
      • push(s,m1)

मैंने इसे सीलोन में लागू किया, आप चाहें तो इसे WebIDE में चला सकते हैं। (यह लूप के प्रत्येक पुनरावृत्ति की शुरुआत में स्टैक को आउटपुट करता है।)

बेशक, यह बस पुनरावृत्ति से निहित कॉल स्टैक को पैरामीटर और रिटर्न मान के साथ एक स्पष्ट स्टैक में ले गया।


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

4
अनुरोधित कार्यक्रम लिखने का प्रयास करने के लिए धन्यवाद।
तोबी अलाफिन

16

पहले से ही कुछ शानदार उत्तर हैं (जो कि मैं भी प्रतिस्पर्धा करने की उम्मीद नहीं कर सकता), लेकिन मैं इस सरल स्पष्टीकरण को पिच करना चाहूंगा।

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

अब, यदि आप अपना स्वयं का स्टैक बनाते हैं, तो स्टैक को धकेलने के साथ पुनरावर्ती फ़ंक्शन कॉल को प्रतिस्थापित किया जाता है, स्टैक को पॉप करने के साथ पुनरावर्ती कार्यों से लौटने की जगह होती है, और थोड़ी देर का लूप होता था जो स्टैक खाली होने तक चलता था?


2

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.