Iteration recursion প্রতিস্থাপন করতে পারেন?


42

আমি সমস্ত স্ট্যাক ওভারফ্লো দেখতে পেয়েছি, উদাহরণস্বরূপ, এখানে , এখানে , এখানে , এখানে , এখানে এবং কিছু অন্যান্য যা উল্লেখ করার দরকার নেই, "যে কোনও প্রোগ্রাম যা পুনরাবৃত্তি ব্যবহার করে কেবলমাত্র পুনরাবৃত্তি ব্যবহার করে কোনও প্রোগ্রামে রূপান্তরিত হতে পারে"।

এমনকি একটি অত্যন্ত upvoted ছিল থ্রেড একটি অত্যন্ত সম্মত সঙ্গে উত্তর যে বলেন হ্যাঁ এটা সম্ভব।

এখন আমি বলছি না যে তারা ভুল ছিল। উত্তরটি আমার কম জ্ঞান এবং কম্পিউটিং সম্পর্কে বোধগম্যতার পক্ষে উত্তর দেয়।

আমি বিশ্বাস করি প্রতিটি পুনরাবৃত্ত ক্রিয়াকলাপ পুনরাবৃত্তি হিসাবে প্রকাশ করা যেতে পারে, এবং উইকিপিডিয়ায় সেই প্রভাবের একটি বিবৃতি রয়েছে। যাইহোক, আমি সন্দেহ করি কনভার্সটি সত্য। একটি হিসাবে, আমি সন্দেহ করি যে অ-আদিম পুনরাবৃত্ত ফাংশনগুলি পুনরাবৃত্তভাবে প্রকাশ করা যেতে পারে।

হাইপার-অপারেশনগুলি পুনরাবৃত্তভাবে প্রকাশ করা যেতে পারে সন্দেহ doubt

তাঁর মধ্যে উত্তর (যা আমি প্রণালী দ্বারা বুঝতে পারছি না) আমার কাছে প্রশ্ন @YuvalFIlmus বলেছেন যে সংযোজন একটা ক্রম মধ্যে গাণিতিক অপারেশনের কোনো ক্রম রূপান্তর করতে সম্ভব নয়।

যদি ওয়াইএফের উত্তরটি সত্যই সঠিক হয় (আমি অনুমান করি এটি তবে তবে তার যুক্তিটি আমার মাথার উপরে ছিল) তবে এর অর্থ এই নয় যে প্রতিটি পুনরাবৃত্তি পুনরাবৃত্তিতে রূপান্তর করা যায় না? কারণ যদি প্রতিটি পুনরাবৃত্তিকে পুনরাবৃত্তিতে রূপান্তর করা সম্ভব হয় তবে আমি সংযোজনগুলির ক্রম হিসাবে সমস্ত ক্রিয়াকলাপটি প্রকাশ করতে সক্ষম হব।

আমার প্রশ্নটি হ'ল:

প্রতিটি পুনরাবৃত্তি পুনরাবৃত্তিতে রূপান্তর করা যেতে পারে এবং কেন?

দয়া করে একটি উত্তর একটি উজ্জ্বল হাইস্কুলার দিন বা একটি প্রথম বছরের আন্ডারগ্রাড বুঝতে পারে। ধন্যবাদ.

পিএস আমি জানি না যে আদিম পুনরাবৃত্তি কী (আমি একারম্যান ফাংশন সম্পর্কে জানি এবং এটি আদিম পুনরাবৃত্ত নয়, তবে এটি এখনও গণনাযোগ্য it

পিপিএস: উত্তরটি যদি হ্যাঁ হয় তবে আপনি উদাহরণস্বরূপ কোনও অ-আদিম-পুনরাবৃত্ত ফাংশনের একটি পুনরাবৃত্ত সংস্করণ লিখতে পারেন। উত্তরে উদাহরণ অ্যাকারম্যান। এটি আমাকে বুঝতে সহায়তা করবে।


21
আপনি একটি সিপিইউতে যা কিছু চালান তা পুনরুক্তিযোগ্য। আপনি এটি উচ্চতর অর্ডার ভাষায় পুনরাবৃত্তভাবে লিখতে পারেন, তবে এটি যাইহোক পুনরাবৃত্তকারী এসেম্বলারের নির্দেশগুলির একগুচ্ছের মধ্যে সংকলিত হয়ে যায়। এতটা আক্ষরিক অর্থে, সংকলকটি ঠিক আপনি যা যা জিজ্ঞাসা করছেন তা করে, এটি আপনার সমস্ত অভিনব পুনরাবৃত্তি একটি সিপিইউর জন্য পুনরাবৃত্ত নির্দেশাবলীর একগুচ্ছ রূপান্তরিত করে।
Davor

6
একটি নিম্ন স্তরে আমাদের বেশিরভাগই জানি যে পুনরাবৃত্তি পুনরাবৃত্তি প্লাস স্ট্যাকের সমান। প্রসঙ্গমুক্ত ব্যাকরণ মডেল পুনরাবৃত্তি, যখন পুশডাউন অটোমেটা স্ট্যাক মেমরির সাথে পুনরাবৃত্ত "প্রোগ্রাম" "
হেনড্রিক জানু

2
কেবল দেখানো যে অন্য উত্তরগুলি পপ আপ হয় কিনা তা দেখার জন্য সাধারণত কমপক্ষে 24 ঘন্টা অপেক্ষা করা ভাল ধারণা। স্বীকৃত প্রশ্নটি আমার কাছে খোলামেলাভাবে মনে হয়েছে এবং এটি ইচ্ছাকৃতভাবে প্রয়োজনের চেয়ে বিষয়গুলিকে আরও জটিল করে তুলেছে quite আপনার প্রশ্নের মূল উত্তর হ'ল "পুনরাবৃত্তির জন্য ব্যবহৃত স্ট্যাকটি পুনরাবৃত্ত উপায়ে স্পষ্টভাবে প্রয়োগ করা যেতে পারে", এবং এর চেয়ে বেশি জটিল হওয়ার দরকার নেই। স্মৃতিশক্তি সীমাহীন হওয়া বা না হওয়া সম্পর্কে বিবেচনাগুলি কার্যকর হয় না কারণ যেভাবেই, পুনরাবৃত্তি স্ট্যাকগুলির জন্য এই বৈশিষ্ট্যটি প্রয়োজনীয়।
AnoE

কেবল পুনরাবৃত্তির সাথে টুরিং মেশিন এমুলেটর বাস্তবায়ন করা সম্ভব
সার্জে বোর্স

আমি তুলনামূলক ভাষাগুলির ক্লাসে আমি দীর্ঘ সময় নিয়েছিলাম, আমাদের একারম্যানের ফাংশনটি সমাবেশে, ফরটারনে (আধুনিক ফোর্টরান নয়) লিখতে হয়েছিল এবং পছন্দ অনুসারে পুনরাবৃত্ত ভাষায় লিখতে হয়েছিল। সুতরাং হ্যাঁ, এটি অনুশীলনে সম্ভব। এবং অবশ্যই এটি তত্ত্বে সম্ভব। উদাহরণস্বরূপ, দেখুন প্রশ্নটি প্রমাণ করে যে টুরিং মেশিন এবং ল্যাম্বডা ক্যালকুলাস সমতুল্য
ডেভিড হামেন

উত্তর:


52

পুনরাবৃত্তি প্লাস আনবাউন্ডেড মেমরির দ্বারা পুনরাবৃত্তি প্রতিস্থাপন করা সম্ভব ।

আপনার যদি কেবল পুনরাবৃত্তি হয় (লুপগুলি চলাকালীন বলুন) এবং একটি সীমাবদ্ধ মেমরি থাকে তবে আপনার সমস্ত কিছুই একটি সসীম অটোমেটন। সীমাবদ্ধ মেমরির সাথে, গণনায় একটি সীমাবদ্ধ সম্ভাব্য পদক্ষেপ রয়েছে, সুতরাং এটি সীমাবদ্ধ অটোমেটনের সাহায্যে সমস্তগুলি অনুকরণ করা সম্ভব।

সীমাহীন স্মৃতি থাকলে চুক্তি বদলে যায়। এই আনবাউন্ডেড মেমরিটি অনেকগুলি রূপ নিতে পারে যা সমপরিমাণ মত প্রকাশের ক্ষমতাতে পরিণত হয়। উদাহরণস্বরূপ, একটি ট্যুরিং মেশিন এটিকে সহজ রাখে: একক টেপ রয়েছে এবং কম্পিউটার একবারে এক ধাপে কেবল টেপটিতে এগিয়ে বা পিছনে সরে যেতে পারে - তবে আপনি পুনরাবৃত্ত ফাংশনগুলির সাহায্যে যা কিছু করতে পারেন তা যথেষ্ট।

একটি ট্যুরিং মেশিনকে চাহিদার সাথে বাড়তি কিছু অতিরিক্ত স্টোরেজ সহ কম্পিউটারের একটি সুনির্দিষ্ট মডেল (সসীম রাষ্ট্র মেশিন) হিসাবে দেখা যেতে পারে। মনে রাখবেন যে এটি অত্যন্ত গুরুত্বপূর্ণ যে কেবল টেপটিতে সীমাবদ্ধ নয়, এমনকি ইনপুটটি দেওয়া হলেও আপনি কতটা টেপের প্রয়োজন হবে তা নির্ভরযোগ্যভাবে বলতে পারবেন না। যদি আপনি ভবিষ্যদ্বাণী করতে পারেন (যেমন গণনা) ইনপুট থেকে কতটা টেপ প্রয়োজন, তবে আপনি সিদ্ধান্ত নিতে পারেন যে সর্বাধিক টেপের আকার গণনা করে এবং তারপরে একটি সীমাবদ্ধ রাষ্ট্রের মেশিন হিসাবে এখন সীমাবদ্ধ টেপ সহ পুরো সিস্টেমটি চিকিত্সা করে গণনাটি থামবে কিনা? ।

কম্পিউটারগুলির সাথে টুরিং মেশিনের অনুকরণ করার আরেকটি উপায় নিম্নরূপ। টিউরিং মেশিনকে এমন একটি কম্পিউটার প্রোগ্রামের সাথে অনুকরণ করুন যা টেপের প্রারম্ভিক স্মৃতিতে সঞ্চয় করে। যদি মেশিনে মাপসই টেপের অংশের শেষের দিকে যদি গণনাটি পৌঁছায়, কম্পিউটারটিকে একটি বড় কম্পিউটার দ্বারা প্রতিস্থাপন করুন এবং পুনরায় গণনাটি চালান।

এখন ধরা যাক আপনি একটি কম্পিউটারের সাথে একটি পুনরাবৃত্ত গণনা অনুকরণ করতে চান। রিকার্সিভ ফাংশনগুলি সম্পাদন করার কৌশলগুলি সুপরিচিত: প্রতিটি ফাংশন কলের একটি মেমরি থাকে যা স্ট্যাক ফ্রেম বলে । গুরুতরভাবে, পুনরাবৃত্ত ফাংশনগুলি চারপাশে ভেরিয়েবলগুলি পাস করে একাধিক কলের মাধ্যমে তথ্য প্রচার করতে পারে। কম্পিউটারে প্রয়োগের ক্ষেত্রে, এর অর্থ এই যে কোনও ফাংশন কল একটি (গ্র্যান্ড-) * প্যারেন্ট কলের স্ট্যাক ফ্রেমে অ্যাক্সেস করতে পারে ।

একটি কম্পিউটার একটি প্রসেসর - একটি সীমাবদ্ধ রাষ্ট্রীয় মেশিন (বিপুল সংখ্যক রাজ্যের সাথে, তবে আমরা এখানে গণনা তত্ত্বটি করছি, সুতরাং এটিই সীমাবদ্ধ) - একটি সীমাবদ্ধ স্মৃতি রয়েছে। লুপ চলাকালীন মাইক্রোপ্রসেসর একটি জায়ান্ট চালায়: "বিদ্যুৎ চালু থাকাকালীন, স্মৃতি থেকে একটি নির্দেশিকাটি পড়ুন এবং এটি সম্পাদন করুন"। (রিয়েল প্রসেসরগুলি এর চেয়ে জটিলতর, তবে তারা কী দ্রুত এবং স্বাচ্ছন্দ্যে তারা এটি করতে পারে তা কীভাবে প্রভাবিত করে না ite) একটি কম্পিউটার পুনরাবৃত্ত ক্রিয়াকলাপগুলি কেবল পুনরুক্তি প্রদানের জন্য লুপের সাথে এটি করতে পারে, এবং আরও প্রক্রিয়া করার জন্য মেমরি অ্যাক্সেস, ইচ্ছায় মেমরির আকার বাড়ানোর ক্ষমতা সহ।

যদি আপনি পুনরাবৃত্তিটি আদিম পুনরাবৃত্তিতে সীমাবদ্ধ করেন তবে আপনি পুনরাবৃত্তিকে বাউন্ডেড পুনরাবৃত্তিতে সীমাবদ্ধ করতে পারেন । এটি হ'ল অপ্রত্যাশিত চলমান সময়ের সাথে লুপগুলি ব্যবহার করার পরিবর্তে আপনি লুপগুলির জন্য ব্যবহার করতে পারেন যেখানে লুপের শুরুতে পুনরাবৃত্তির সংখ্যাটি জানা যায় ¹ প্রোগ্রামের শুরুতে পুনরাবৃত্তির সংখ্যাটি জানা নাও যেতে পারে: এটি নিজে পূর্ববর্তী লুপগুলি দ্বারা গণনা করা যেতে পারে।

আমি এখানে একটি প্রমাণও স্কেচ করতে যাচ্ছি না, তবে আদিম পুনরাবৃত্তি থেকে সম্পূর্ণ পুনরাবৃত্তিতে যাওয়া, এবং লুপগুলি যখন লুপগুলি অবলম্বন করতে যাচ্ছি তার মধ্যে একটি স্বজ্ঞাত সম্পর্ক রয়েছে: উভয় ক্ষেত্রেই এর আগে আপনি আগে কখন না জেনে থাকবেন বন্ধ। সম্পূর্ণ পুনরাবৃত্তি সহ, এটি মিনিমাইজেশন অপারেটরের সাথে সম্পন্ন করা হয়, যেখানে আপনি শর্তটি সন্তুষ্ট করে এমন কোনও পরামিতি না পাওয়া পর্যন্ত আপনি চালিয়ে যান। লুপগুলির সাথে, লুপের শর্তটি সন্তুষ্ট না হওয়া পর্যন্ত এটি চালিয়ে যাওয়া দ্বারা করা হয়।

forwhilen


অনুরোধের স্তরে রাখা বিশদ ব্যাখ্যার জন্য গ্রহণ করা।
টবি আলাফিন

12
আমি মনে করি এটি বাস্তব কম্পিউটারগুলির তুলনায় লক্ষ্য করার মতো, পুনরাবৃত্তি স্মৃতিও ব্যবহার করে (কল স্ট্যাক বাড়ছে)। সুতরাং ব্যবহারিক অ্যাপ্লিকেশনগুলিতে আনবাউন্ডেড মেমরির প্রয়োজন নেই (কারণ সবকিছু সমানভাবে এটি দ্বারা আবদ্ধ)। এবং পুনরাবৃত্তি প্রায়শই পুনরাবৃত্তির চেয়ে বেশি মেমরির প্রয়োজন।
এজেন্ট_এল

@ এজেন্ট_এল হ্যাঁ, সমস্ত স্ট্যাক ফ্রেমগুলি সঞ্চয় করতে পুনরাবৃত্তির আনবাউন্ডেড মেমরির প্রয়োজন। একটি পুনরাবৃত্তি পদ্ধতির সাথে, আনবাউন্ডেড মেমরির প্রয়োজনীয়তা রয়েছে তবে এটি পুনরাবৃত্তির মতো ক্রিয়াকলাপগুলির ক্রম থেকে স্বজ্ঞাতভাবে পৃথক নয়।
গিলস 16'15

1
সম্ভবত আগ্রহের বিষয় হ'ল চার্চ-টিউরিং থিসিস। টুরিং মেশিনগুলি পুনরাবৃত্তির কোনও (সহজাত) ধারণা সহ উচ্চ পুনরাবৃত্তিযোগ্য মেশিন। ল্যাম্বদা ক্যালকুলাস একটি ভাষা যা পুনরাবৃত্তভাবে গণনা প্রকাশ করার জন্য তৈরি হয়েছিল। চার্চ-টিউরিং থিসিসটি দেখিয়েছিল যে সমস্ত ল্যাম্বডা অভিব্যক্তি পুনরাবৃত্তি এবং পুনরাবৃত্তিকে সংযুক্ত করে একটি টুরিং মেশিনে মূল্যায়ন করা যেতে পারে।
আম্মনকে

1
@ ব্ল্যাকভিজেটেবল যদি কোনও পুনরাবৃত্ত পদ্ধতির কোনও অভ্যন্তরীণ ভেরিয়েবল না থাকে এবং এটি কেবলমাত্র মেমরির ব্যবহার করে তা কল স্ট্যাক (টিসিও দ্বারা কী অনুকূলিত করা যায়), তবে এটির পুনরুক্তি সংস্করণটির সম্ভবত কোনও অভ্যন্তরীণ ভেরিয়েবল থাকবে না এবং কেবলমাত্র ধ্রুব পরিমাণের মেমরি ব্যবহার করবে ( পরিবর্তনগুলি) কাউন্টারের মতো সমস্ত পুনরাবৃত্তির জুড়ে ভাগ করা হয়েছে।
এজেন্ট_এল

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)

আমি এটি সিলেনে প্রয়োগ করেছি, আপনি চাইলে এটি ওয়েবআইডিইতে চালাতে পারেন। (এটি লুপের প্রতিটি পুনরাবৃত্তির শুরুতে স্ট্যাকটিকে আউটপুট করে))

অবশ্যই, এটি কেবল পুনরাবৃত্তি থেকে অন্তর্ভুক্ত কল স্ট্যাককে প্যারামিটার এবং রিটার্ন মানগুলির সাথে একটি স্পষ্ট স্ট্যাকে স্থানান্তরিত করেছে।


15
আমি মনে করি এটি একটি গুরুত্বপূর্ণ বিষয়। আপনি বেশ স্পষ্টভাবে দেখিয়েছেন যে পুনরাবৃত্তি বিশেষ কিছু নয় এবং কেবলমাত্র কল স্ট্যাকের ট্র্যাক রেখে এটি সরিয়ে নেওয়া যেতে পারে, বরং সংকলকটি এটি করার অনুমতি দেয়। পুনরাবৃত্তি হ'ল একটি সংকলক বৈশিষ্ট্য যা এই জাতীয় প্রোগ্রামকে লেখা সহজ করে তোলে।
ডেভিড রিচার্বি

4
অনুরোধ করা প্রোগ্রামটি লেখার চেষ্টা করার জন্য ধন্যবাদ।
টবি আলাফিন

16

ইতিমধ্যে কিছু দুর্দান্ত উত্তর রয়েছে (যার সাথে প্রতিযোগিতা করার আশাও করতে পারি না) তবে আমি এই সাধারণ ব্যাখ্যাটি পেশ করতে চাই।

পুনরাবৃত্তি কেবল রানটাইম স্ট্যাকের ম্যানিপুলেশন। পুনরাবৃত্তি একটি নতুন স্ট্যাক ফ্রেম যুক্ত করে (পুনরাবৃত্ত ফাংশনটির নতুন আহ্বানের জন্য), এবং ফিরে আসা একটি স্ট্যাক ফ্রেম সরিয়ে দেয় (পুনরাবৃত্ত ফাংশনের সদ্য সমাপ্ত উদ্ভাবনের জন্য)। পুনরাবৃত্তির ফলে বেশ কয়েকটি স্ট্যাক ফ্রেম যুক্ত / সরিয়ে ফেলা হবে, অবশেষে সেগুলি সমস্ত প্রস্থান করে (আশা!) এবং ফলাফলটি কলারে ফিরে আসে।

এখন, যদি আপনি নিজের স্ট্যাক তৈরি করেন, স্ট্যাকের দিকে ধাক্কা দিয়ে পুনরাবৃত্ত ফাংশন কলগুলি প্রতিস্থাপন করেন, স্ট্যাকটি পপিংয়ের সাথে পুনরাবৃত্ত ফাংশনগুলি থেকে ফিরে এসে প্রতিস্থাপন করেন এবং স্ট্যাকটি ফাঁকা না হওয়া পর্যন্ত চালানো কিছুক্ষণ লুপ পান তবে কী হবে?


2

আমি যতদূর বলতে পারি এবং আমার নিজের অভিজ্ঞতায় আপনি কোনও পুনরাবৃত্তি পুনরাবৃত্তি হিসাবে প্রয়োগ করতে পারেন। উপরে উল্লিখিত হিসাবে, পুনরাবৃত্তি স্ট্যাকটি ব্যবহার করে, যা ধারণাগতভাবে সীমাহীন তবে বাস্তবিকভাবে সীমাবদ্ধ (আপনি কি কখনও স্ট্যাকের ওভারফ্লো বার্তা পেয়েছেন?) প্রোগ্রামিংয়ের আমার প্রথম দিনগুলিতে (শেষ সহস্রাব্দের শেষ শতাব্দীর তৃতীয় কোয়ার্টারে) আমি পুনরাবৃত্তিমূলক ভাষা ব্যবহার করছিলাম পুনরাবৃত্ত আলগোরিদিমগুলি প্রয়োগ করে এবং কোনও সমস্যা ছিল না। যদিও কেউ এটি প্রমাণ করবে তা সম্পর্কে আমি নিশ্চিত নই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.