Corecursion
কম্পিউটার বিজ্ঞানে, কোরকারসন হল এক ধরনের অপারেশন যা পুনরাবৃত্তির দ্বৈত। যেখানে পুনরাবৃত্তি বিশ্লেষণাত্মকভাবে কাজ করে, একটি বেস কেস থেকে আরও ডেটা শুরু করে এবং এটিকে ছোট ডেটাতে বিভক্ত করে এবং একটি বেস কেস পর্যন্ত না পৌঁছানো পর্যন্ত পুনরাবৃত্তি করে, কোরকারসন কৃত্রিমভাবে কাজ করে, একটি বেস কেস থেকে শুরু করে এবং এটি তৈরি করে, পুনরাবৃত্তভাবে একটি বেস কেস থেকে আরও সরানো ডেটা তৈরি করে। সহজ কথায় বলতে গেলে, কোরকার্সিভ অ্যালগরিদমগুলি ডেটা ব্যবহার করে যা তারা নিজেরাই তৈরি করে, বিট দ্বারা বিট, যেমন তারা উপলব্ধ হয় এবং প্রয়োজন হয়, আরও বিট ডেটা তৈরি করতে। একটি অনুরূপ কিন্তু স্বতন্ত্র ধারণা হল উৎপাদক পুনরাবৃত্তি যার কোরকারসন এবং পুনরাবৃত্তির অন্তর্নিহিত একটি নির্দিষ্ট "দিক"-এর অভাব থাকতে পারে। যেখানে পুনরাবৃত্তি প্রোগ্রামগুলিকে নির্বিচারে জটিল ডেটাতে কাজ করার অনুমতি দেয়, যতক্ষণ না সেগুলিকে সহজ ডেটাতে (বেস কেস) হ্রাস করা যায়, ততক্ষণ কোরকারসন প্রোগ্রামগুলিকে নির্বিচারে জটিল এবং সম্ভাব্য অসীম ডেটা স্ট্রাকচার তৈরি করার অনুমতি দেয়, যেমন স্ট্রিম, যতক্ষণ না এটি তৈরি করা যায় সহজ ডেটা (বেস কেস) থেকে সসীম ধাপের ক্রমে। যেখানে পুনরাবৃত্তি শেষ নাও হতে পারে, কখনও কোনও মূল অবস্থায় পৌঁছতে পারে না, কোরকারসন একটি মূল অবস্থা থেকে শুরু হয় এবং এইভাবে পরবর্তী পদক্ষেপগুলি নির্ধারণমূলকভাবে তৈরি করে, যদিও এটি অনির্দিষ্টকালের জন্য এগিয়ে যেতে পারে (এবং এইভাবে কঠোর মূল্যায়নের অধীনে শেষ হয় না), অথবা এটি উৎপাদনের চেয়ে বেশি খরচ করতে পারে এবং এইভাবে অ-উত্পাদনশীল হয়ে উঠতে পারে। অনেক ফাংশন যা ঐতিহ্যগতভাবে পুনরাবৃত্তিমূলক হিসাবে বিশ্লেষণ করা হয় বিকল্পভাবে, এবং যুক্তিযুক্তভাবে আরও স্বাভাবিকভাবে, কোরকার্সিভ ফাংশন হিসাবে ব্যাখ্যা করা যেতে পারে যা একটি নির্দিষ্ট পর্যায়ে শেষ হয়, উদাহরণস্বরূপ পুনরাবৃত্তি সম্পর্ক যেমন ফ্যাক্টোরিয়াল। কোরকারসন ফলাফল হিসাবে সীমাবদ্ধ এবং অসীম উভয় তথ্য কাঠামো তৈরি করতে পারে এবং স্ব-রেফারেন্সিয়াল তথ্য কাঠামো নিয়োগ করতে পারে। কোরকারসন প্রায়শই অলস মূল্যায়নের সাথে ব্যবহার করা হয়, একটি সম্ভাব্য অসীম কাঠামোর শুধুমাত্র একটি সীমাবদ্ধ উপসেট তৈরি করতে (একবারে একটি সম্পূর্ণ অসীম কাঠামো তৈরি করার চেষ্টা করার পরিবর্তে)। কার্যকরী প্রোগ্রামিংয়ে কোরকারসন একটি বিশেষ গুরুত্বপূর্ণ ধারণা, যেখানে কোরকারসন এবং কোডাটা মোট ভাষাগুলিকে অসীম তথ্য কাঠামোর সাথে কাজ করার অনুমতি দেয়। উদাহরণ কোরকারসনকে পুনরাবৃত্তির বিপরীতে বোঝা যায়, যা আরও পরিচিত। যদিও কোরকারসন প্রাথমিকভাবে কার্যকরী প্রোগ্রামিং-এ আগ্রহী, এটি অপরিহার্য প্রোগ্রামিং ব্যবহার করে চিত্রিত করা যেতে পারে, যা পাইথনে জেনারেটর সুবিধা ব্যবহার করে নীচে করা হয়েছে। এই উদাহরণগুলিতে স্থানীয় চলকগুলি ব্যবহার করা হয় এবং বাধ্যতামূলকভাবে (ধ্বংসাত্মকভাবে) মান বরাদ্দ করা হয়, যদিও বিশুদ্ধ কার্যকরী প্রোগ্রামিংয়ে কোরকার্সনে এগুলির প্রয়োজন হয় না। বিশুদ্ধ কার্যকরী প্রোগ্রামিং-এ, স্থানীয় চলকগুলিকে বরাদ্দ করার পরিবর্তে, এই গণনাকৃত মানগুলি একটি অপরিবর্তনীয় ক্রম গঠন করে এবং পূর্ববর্তী মানগুলি স্ব-রেফারেন্স দ্বারা অ্যাক্সেস করা হয় (ক্রমের পরবর্তী মানগুলি গণনা করার ক্রমের পূর্ববর্তী মানগুলিকে উল্লেখ করে)। অ্যাসাইনমেন্টগুলি কেবল অপরিহার্য দৃষ্টান্তের মধ্যে এটি প্রকাশ করে এবং স্পষ্টভাবে উল্লেখ করে যে গণনাগুলি কোথায় ঘটে, যা ব্যাখ্যাটি স্পষ্ট করতে কাজ করে। ফ্যাক্টরিয়াল পুনরাবৃত্তির একটি সর্বোত্তম উদাহরণ হল ফ্যাক্টরিয়াল গণনা করা, যা 0 দ্বারা পুনরাবৃত্তভাবে সংজ্ঞায়িত করা হয়! : = 1 এবং এন! : = n × (n-1)! একটি প্রদত্ত ইনপুটের উপর তার ফলাফল পুনরাবৃত্তিমূলকভাবে গণনা করতে, একটি পুনরাবৃত্তিমূলক ফাংশন একটি ভিন্ন (কোনওভাবে "ছোট") ইনপুট দিয়ে নিজেকে (একটি অনুলিপি) কল করে এবং তার ফলাফল তৈরি করতে এই কলের ফলাফল ব্যবহার করে। পুনরাবৃত্তিমূলক কলটি একই কাজ করে, যদি না বেস কেসটি পৌঁছায়। এইভাবে এই প্রক্রিয়ায় একটি কল স্ট্যাক তৈরি হয়। উদাহরণস্বরূপ, ফেস (3) গণনা করার জন্য, এটি পুনরাবৃত্তভাবে ফেস (2), ফেস (1), ফেস (0) (স্ট্যাককে "শেষ করা") কল করে, যে সময়ে পুনরাবৃত্তি ফেস (0) = 1 দিয়ে শেষ হয়, এবং তারপর স্ট্যাকটি বিপরীত ক্রমে শিথিল হয় এবং ফলাফলগুলি প্রাথমিক কল ফ্রেম ফেস (3)-এ কল স্ট্যাক বরাবর ফিরে যাওয়ার পথে গণনা করা হয় যা ফেস (2) = 2-এর ফলাফল ব্যবহার করে চূড়ান্ত ফলাফলটি 3 × 2 = 3 × ফেস (2) =: ফেস (3) হিসাবে গণনা করে এবং অবশেষে ফেস (3) = 6 ফেরত দেয়। এই উদাহরণে একটি ফাংশন একটি একক মান প্রদান করে। এই স্ট্যাক আনওয়াইন্ডিং ব্যাখ্যা করা যেতে পারে, ফ্যাক্টরিয়াল কোরকার্সিয়ালকে একটি পুনরাবৃত্তিকারী হিসাবে সংজ্ঞায়িত করে, যেখানে একজন 1,2,3 সংখ্যা বৃদ্ধির জন্য ফ্যাক্টরিয়াল মান তৈরি করে, যেমন উপরের পুনরাবৃত্তিমূলক সংজ্ঞায় "সময় তীর" বিপরীত, যেমন ছিল, এটিকে পিছন দিকে পড়ে কোরকার্সিয়াল অ্যালগরিদম এইভাবে সংজ্ঞায়িত সমস্ত ফ্যাক্টরিয়ালের একটি প্রবাহ তৈরি করে। এটি একটি জেনারেটর হিসাবে সুনির্দিষ্টভাবে প্রয়োগ করা যেতে পারে। প্রতীকীভাবে, পরবর্তী ফ্যাক্টরিয়াল মান গণনা করার জন্য n এবং f (একটি পূর্ববর্তী ফ্যাক্টরিয়াল মান) উভয়ের উপর নজর রাখা প্রয়োজন, এটি এইভাবে উপস্থাপন করা যেতে পারেঃ অথবা হাস্কেলে, (\(n, f)-> (n + 1, f * (n + 1)) 'পুনরাবৃত্তি' (0,1) মানে, "থেকে শুরু করে, প্রতিটি ধাপে পরবর্তী মানগুলি হিসাবে গণনা করা হয়"। এটি গাণিতিকভাবে সমতুল্য এবং পুনরাবৃত্তিমূলক সংজ্ঞার সাথে প্রায় অভিন্ন, তবে এটি জোর দেয় যে ফ্যাক্টোরিয়াল মানগুলি তৈরি করা হচ্ছে, প্রাথমিক কেস থেকে এগিয়ে যাওয়া, প্রথমে পিছন দিকে যাওয়ার পরে গণনা করার পরিবর্তে, একটি হ্রাস সহ। কোরকার্সিভ ফাংশনের সরাসরি আউটপুট কেবল ফ্যাক্টরিয়াল মান ধারণ করে না, তবে প্রতিটি মানের জন্য অনুক্রমের মধ্যে তার সূচক এন-এর সহায়ক তথ্যও অন্তর্ভুক্ত করে, যাতে যখন প্রয়োজন হয় তখন তাদের মধ্যে যে কোনও একটি নির্দিষ্ট ফলাফল নির্বাচন করা যায়। ডিনোটেশনাল শব্দার্থবিজ্ঞানের সাথে একটি সংযোগ রয়েছে, যেখানে পুনরাবৃত্তিমূলক প্রোগ্রামগুলির ডিনোটেশনগুলি এইভাবে কোরকারসিভভাবে তৈরি করা হয়। পাইথনে, একটি পুনরাবৃত্তিমূলক ফ্যাক্টোরিয়াল ফাংশনকে সংজ্ঞায়িত করা যেতে পারেঃ ডেফ ফ্যাক্টোরিয়াল (n: int)-> int: "পুনরাবৃত্তিমূলক ফ্যাক্টোরিয়াল ফাংশন"। যদি n = = 0: অন্যথায় 1 রিটার্ন করেঃ n * ফ্যাক্টরিয়াল (n-1) রিটার্ন করে তবে এটিকে উদাহরণস্বরূপ 5 গণনা করার জন্য ফ্যাক্টরিয়াল (5) বলা যেতে পারে! একটি সংশ্লিষ্ট কোরকার্সিভ জেনারেটরকে সংজ্ঞায়িত করা যেতে পারেঃ ডেফ ফ্যাক্টরিয়াল (): "কোরকার্সিভ জেনারেটর"। n, f = 0,1 যেখানে সত্যঃ ফলন f n, f = n + 1, f * (n + 1) এটি ক্রমানুসারে ফ্যাক্টরিয়ালগুলির একটি অসীম প্রবাহ তৈরি করে; এর একটি সীমাবদ্ধ অংশ তৈরি করা যেতে পারেঃ ডেফ n _ ফ্যাক্টরিয়াল (n: int): k, f = 0,1 এবং k <= n: ফলন f k, f = k + 1, f * (k + 1) এটি তখন 5 পর্যন্ত ফ্যাক্টরিয়াল তৈরি করতে বলা যেতে পারে! মাধ্যমেঃ f-এর জন্য n _ ফ্যাক্টরিয়ালগুলিতে (5): মুদ্রণ (f) যদি আমরা শুধুমাত্র একটি নির্দিষ্ট ফ্যাক্টরিয়ালের প্রতি আগ্রহী থাকি, তবে কেবল শেষ মানটি নেওয়া যেতে পারে, অথবা আমরা উৎপাদন এবং প্রবেশাধিকারকে একটি ফাংশনে ফিউজ করতে পারি, ডেফ nth _ ফ্যাক্টরিয়াল (n: int): k, f = 0,1 যখন k <n: k, f = k + 1, f * (k + 1) রিটার্ন f। সুতরাং এটি বলা যেতে পারে যে কোরকার্সনের ধারণাটি পুনরাবৃত্তিমূলক সংজ্ঞা দ্বারা পুনরাবৃত্তিমূলক গণনা প্রক্রিয়াগুলির মূর্ত রূপের একটি ব্যাখ্যা, যেখানে প্রযোজ্য। একইভাবে, ফিবোনাচ্চি ক্রমকে এভাবে উপস্থাপন করা যেতে পারেঃ যেহেতু ফিবোনাচ্চি ক্রমটি ক্রম 2-এর একটি পুনরাবৃত্তির সম্পর্ক, তাই কোরকার্সিভ সম্পর্ককে অবশ্যই দুটি ধারাবাহিক পদ অনুসরণ করতে হবে, যার সাথে একটি ধাপ এগিয়ে যাওয়ার জন্য সংশ্লিষ্ট এবং পরবর্তী পদ গণনা করার জন্য সংশ্লিষ্ট। এরপরে এটি নিম্নরূপ প্রয়োগ করা যেতে পারে (সমান্তরাল অ্যাসাইনমেন্ট ব্যবহার করে): ডেফ ফাইবোনাচি _ সিকোয়েন্স (): a, b = 0,1 যেখানে সত্যঃ a a, b = b, a + b দেয় হাস্কেলে, মানচিত্র fst ((\(a, b)-> (b, a + b) 'পুনরাবৃত্তি' (0,1)) গভীরতা-প্রথম পদ্ধতির মাধ্যমে ট্রি ট্র্যাভার্সাল ট্রি ট্র্যাভার্সাল পুনরাবৃত্তির একটি সর্বোত্তম উদাহরণ। দ্বৈতভাবে, প্রস্থ-প্রথম ট্র্যাভারসাল খুব স্বাভাবিকভাবেই কোরকার্সনের মাধ্যমে প্রয়োগ করা যেতে পারে। পুনরাবৃত্তিমূলকভাবে, কেউ একটি ট্রি অতিক্রম করতে পারে তার মূল নোডকে একটি ডেটা স্ট্রাকচারে রেখে, তারপর সেই ডেটা স্ট্রাকচারের সাথে পুনরাবৃত্তি করে যখন এটি খালি থাকে না, প্রতিটি পদক্ষেপে এটি থেকে প্রথম নোডটি সরিয়ে এবং সরানো নোডের চাইল্ড নোডগুলিকে সেই ডেটা স্ট্রাকচারে ফিরিয়ে রাখতে পারে। যদি ডেটা স্ট্রাকচারটি একটি স্ট্যাক (এল. আই. এফ. ও) হয়, তবে এটি ডেপথ-ফার্স্ট ট্র্যাভার্সাল দেয় এবং যদি ডেটা স্ট্রাকচারটি একটি সারি (এফ. আই. এফ. ও) হয়, তবে এটি প্রস্থ-ফার্স্ট ট্র্যাভার্সাল দেয়ঃ রিকার্সন ব্যবহার করে, একটি গাছের ডেপথ-ফার্স্ট ট্র্যাভার্সাল কেবল রুট নোডের প্রতিটি চাইল্ড নোডকে পুনরাবৃত্তভাবে অতিক্রম করার মতো প্রয়োগ করা হয়। এইভাবে প্রথম চাইল্ড সাবট্রি শেষ না হওয়া পর্যন্ত দ্বিতীয় চাইল্ড সাবট্রি প্রক্রিয়া করা হয় না। রুট নোডের মান আলাদাভাবে পরিচালিত হয়, প্রথম চাইল্ড অতিক্রম করার আগে (যার ফলে প্রি-অর্ডার ট্র্যাভার্সাল হয়), প্রথমটি শেষ হওয়ার পরে এবং দ্বিতীয়টি (ইন-অর্ডার), বা দ্বিতীয় চাইল্ড নোড শেষ হওয়ার পরে (পোস্ট-অর্ডার)-- উদ্ভিদের সরলতার জন্য গাছটিকে বাইনারি ধরে নেওয়া হয়। কল স্ট্যাক (পুনরাবৃত্তিমূলক ট্র্যাভার্সাল ফাংশন আহ্বানের) স্ট্যাকের সাথে মিলে যায় যা উপরে উল্লিখিত স্পষ্ট এল. আই. এফ. ও কাঠামোর কারসাজির সাথে পুনরাবৃত্তি করা হবে। প্রতীকীভাবে, "রিকার্সন"-এর এখানে দুটি অর্থ রয়েছে। প্রথমত, ট্রি ট্র্যাভার্সাল ফাংশনের পুনরাবৃত্তিমূলক আহ্বান। আরও প্রাসঙ্গিকভাবে, মানগুলির ফলস্বরূপ তালিকাটি এখানে কীভাবে তৈরি করা হয়েছে তার সাথে আমাদের লড়াই করতে হবে। পুনরাবৃত্তিমূলক, বটম-আপ আউটপুট তৈরির ফলে ডান থেকে বাম দিকে ট্রি ট্র্যাভার্সাল হবে। এটি প্রকৃতপক্ষে বাঁ-থেকে-ডান ক্রমে সম্পাদন করার জন্য ক্রমটি কিছু বহিরাগত উপায়ে প্রয়োগ করতে হবে, অথবা আউটপুটটি যদি উপরে-নিচে ফ্যাশনে তৈরি করা হয় তবে এটি স্বয়ংক্রিয়ভাবে অর্জন করা হবে, অর্থাৎ। কোরকুরসিভ। একটি প্রস্থ-প্রথম ট্র্যাভারসাল মূল নোড থেকে শুরু করে, তার মান আউটপুট করে, তারপর প্রস্থ-প্রথম সাবট্রিকে অতিক্রম করে-অর্থাৎ, পরবর্তী ধাপে সাবট্রির পুরো তালিকাটি পাস করে (একটিও সাবট্রিকে নয়, পুনরাবৃত্তিমূলক পদ্ধতির মতো)-পরবর্তী ধাপে তাদের সমস্ত মূল নোডের মান আউটপুট করে, তারপর তাদের চাইল্ড সাবট্রিকে পাস করে ইত্যাদি। এই ক্ষেত্রে জেনারেটর ফাংশন, প্রকৃতপক্ষে আউটপুট ক্রম নিজেই, সারি হিসাবে কাজ করে। উপরের ফ্যাক্টরিয়াল উদাহরণের মতো, যেখানে সূচকের সহায়ক তথ্য (কোন ধাপে প্রথমটি ছিল, এন) এগিয়ে দেওয়া হয়েছিল, n!-এর প্রকৃত আউটপুট ছাড়াও, এই ক্ষেত্রে প্রকৃত আউটপুট ছাড়াও অবশিষ্ট সাবট্রির সহায়ক তথ্য এগিয়ে দেওয়া হয়। প্রতীকীভাবে, যার অর্থ হল যে প্রতিটি ধাপে, একজন এই স্তরের নোডের মানগুলির তালিকা প্রকাশ করে, তারপর পরবর্তী স্তরের নোডগুলিতে অগ্রসর হয়। এই ক্রম থেকে শুধুমাত্র নোডের মান তৈরি করার জন্য কেবল সহায়ক চাইল্ড ট্রি ডেটা ফেলে দেওয়া প্রয়োজন, তারপর তালিকার তালিকা সমতল করা (মানগুলি প্রাথমিকভাবে স্তর (গভীরতা) দ্বারা গোষ্ঠীভুক্ত করা হয়; সমতল করা (আনগ্রুপিং) একটি সমতল রৈখিক তালিকা প্রদান করে)। এটি সম্প্রসারণগতভাবে উপরের নির্দিষ্টকরণের সমতুল্য। হাস্কেলে, কনক্যাটম্যাপ এফ. এস. টি (((v, ts)-> (রুট ভ্যালু ts, চাইল্ডট্রিস ts)) 'ইটারেট' ([], [ফুলট্রিস]) উল্লেখযোগ্যভাবে, একটি অসীম গাছ দেওয়া হলে, কোরকার্সিভ প্রস্থ-প্রথম ট্র্যাভার্সাল সমস্ত নোড অতিক্রম করবে, ঠিক যেমন একটি সীমাবদ্ধ গাছের জন্য, যখন পুনরাবৃত্ত গভীরতা-প্রথম ট্র্যাভার্সাল একটি শাখায় নেমে যাবে এবং সমস্ত নোড অতিক্রম করবে না, এবং প্রকৃতপক্ষে যদি পোস্ট-অর্ডার অতিক্রম করে, যেমন এই উদাহরণে (বা ক্রমানুসারে), এটি কোনও নোডে যাবে না, কারণ এটি কখনই একটি পাতায় পৌঁছায় না। এটি অসীম তথ্য কাঠামো নিয়ে কাজ করার জন্য পুনরাবৃত্তির পরিবর্তে কোরকার্সনের উপযোগিতা দেখায়। একটি সতর্কতা এখনও অসীম শাখা ফ্যাক্টর সহ গাছগুলির জন্য রয়ে গেছে, যার স্থানটি আরও ভালভাবে অন্বেষণ করার জন্য আরও মনোযোগী ইন্টারলেসিং প্রয়োজন। ডুভেটেলিং দেখুন। পাইথনে, এটি নিম্নরূপ প্রয়োগ করা যেতে পারে। সাধারণ পোস্ট-অর্ডার ডেপথ-ফার্স্ট ট্র্যাভার্সালকে সংজ্ঞায়িত করা যেতে পারেঃ ডিএফ ডিএফ (নোড): "পোস্ট-অর্ডার ডেপথ-ফার্স্ট ট্র্যাভার্সাল"। যদি নোডটি নন না হয়ঃ df (node.left) df (node.right) প্রিন্ট (node.value) এটি পরে পোস্ট-অর্ডার গভীরতা-প্রথম ক্রমে গাছের নোডগুলির মানগুলি মুদ্রণ করতে df (t) দ্বারা কল করা যেতে পারে। প্রস্থ-প্রথম কোরকার্সিভ জেনারেটরকে সংজ্ঞায়িত করা যেতে পারেঃ ডেফ বিএফ (ট্রি): "প্রস্থ-প্রথম কোরকার্সিভ জেনারেটর"। বৃক্ষ তালিকা = [বৃক্ষ] যখন বৃক্ষ তালিকাঃ নতুন _ বৃক্ষ তালিকা = [] বৃক্ষ তালিকায় বৃক্ষের জন্যঃ যদি বৃক্ষ কিছুই না হয়ঃ ফলন tree.value new_tree_list.append (tree.left) new_tree_list.append (tree.right) বৃক্ষ তালিকা = নতুন _ বৃক্ষ তালিকা এটি তখন গাছের নোডের মানগুলি প্রস্থ-প্রথম ক্রমে মুদ্রণ করার জন্য বলা যেতে পারেঃ bf (t)-এ i-এর জন্যঃ মুদ্রণ (i) সংজ্ঞা প্রাথমিক তথ্য প্রকারগুলিকে কোনও ধরনের সমীকরণের সর্বনিম্ন স্থির বিন্দু (সমরূপতা পর্যন্ত) হিসাবে সংজ্ঞায়িত করা যেতে পারে; সমরূপতা তারপর একটি প্রাথমিক বীজগণিত দ্বারা দেওয়া হয়। দ্বৈতভাবে, চূড়ান্ত (বা টার্মিনাল) তথ্য প্রকারকে একটি প্রকার সমীকরণের সর্বশ্রেষ্ঠ স্থির বিন্দু হিসাবে সংজ্ঞায়িত করা যেতে পারে; আইসোমরফিজম তারপর একটি চূড়ান্ত কোলজেব্রা দ্বারা দেওয়া হয়। যদি কথোপকথনের ক্ষেত্রটি সেট এবং মোট ফাংশনের বিভাগ হয়, তবে চূড়ান্ত ডেটা প্রকারগুলিতে অসীম, অ-প্রতিষ্ঠিত মান থাকতে পারে, যেখানে প্রাথমিক প্রকারগুলি তা করে না। অন্যদিকে, যদি কথোপকথনের ক্ষেত্রটি সম্পূর্ণ আংশিক ক্রম এবং অবিচ্ছিন্ন ফাংশনের বিভাগ হয়, যা মোটামুটিভাবে হাস্কেল প্রোগ্রামিং ভাষার সাথে মিলে যায়, তবে চূড়ান্ত প্রকারগুলি প্রাথমিক প্রকারের সাথে মিলে যায় এবং সংশ্লিষ্ট চূড়ান্ত কোলজেব্রা এবং প্রাথমিক বীজগণিত একটি সমরূপতা গঠন করে। কোরকারসন তখন পুনরাবৃত্তিমূলকভাবে ফাংশনগুলিকে সংজ্ঞায়িত করার একটি কৌশল যার পরিসীমা (কোডোমেইন) একটি চূড়ান্ত ডেটা টাইপ, যা সাধারণ পুনরাবৃত্তিমূলক পুনরাবৃত্তিমূলকভাবে এমন ফাংশনগুলিকে সংজ্ঞায়িত করে যার ডোমেন একটি প্রাথমিক ডেটা টাইপ। নীচের আলোচনাটি হাস্কেলের বেশ কয়েকটি উদাহরণ প্রদান করে যা কোরকারশনকে আলাদা করে। মোটামুটিভাবে বলতে গেলে, যদি কেউ এই সংজ্ঞাগুলিকে সেটের বিভাগে পোর্ট করে, তবে সেগুলি এখনও কোরকারসিভ হবে। এই অনানুষ্ঠানিক ব্যবহার হাস্কেল সম্পর্কে বিদ্যমান পাঠ্যপুস্তকগুলির সাথে সামঞ্জস্যপূর্ণ। এই নিবন্ধে ব্যবহৃত উদাহরণগুলি কোরকারসনকে সংজ্ঞায়িত করার এবং এটি কী তা ব্যাখ্যা করার প্রচেষ্টার পূর্ববর্তী। আলোচনা কোডাটার উপর আদিম কোরকার্সনের নিয়মটি ডেটার উপর আদিম পুনরাবৃত্তির জন্য দ্বৈত। যুক্তিটির গঠনকারীদের উপর প্যাটার্ন-ম্যাচিং দ্বারা যুক্তির উপর অবতরণ করার পরিবর্তে (যা আগে, কোথাও বলা হয়েছিল, তাই আমরা একটি প্রস্তুত-তৈরি উপাত্ত পাই এবং এর উপাদান উপ-অংশে পৌঁছাই, অর্থাৎ। "ক্ষেত্র"), আমরা ফলাফলের উপর আরোহণ করি তার "ধ্বংসকারী" (বা "পর্যবেক্ষক", যা পরে বলা হবে, কোথাও-তাই আমরা আসলে একটি কনস্ট্রাক্টরকে ডাকছি, ফলাফলের আরেকটি বিট তৈরি করছি যা পরে পর্যবেক্ষণ করা হবে)। এইভাবে কোরকারসন (সম্ভাব্য অসীম) কোডাটা তৈরি করে, যেখানে সাধারণ পুনরাবৃত্তি (অপরিহার্যভাবে সীমাবদ্ধ) তথ্য বিশ্লেষণ করে। সাধারণ পুনরাবৃত্তি কোডাটার ক্ষেত্রে প্রযোজ্য নাও হতে পারে কারণ এটি শেষ নাও হতে পারে। বিপরীতভাবে, যদি ফলাফলের ধরন ডেটা হয় তবে কোরকার্সনের কঠোরভাবে প্রয়োজন হয় না, কারণ ডেটা অবশ্যই সীমাবদ্ধ হতে হবে। "কোকিউ-এ স্ট্রিমগুলির সাথে প্রোগ্রামিংঃ একটি কেস স্টাডিঃ দ্য সিভ অফ এরাটোস্থেনিস"-এ আমরা খুঁজে পাই এইচডি (কনস এ এস) = এ টিল (কনস এ এস) = এস (সিভ পি এস) = যদি ডিভি পি (এইচডি এস) হয় তবে পি (টিল এস) অন্য কনস (এইচডি এস) (সিভ পি (টিল এস)) এইচডি (প্রাইম এস) = (এইচডি এস) টিল (প্রাইম এস) = প্রাইম (সিভ (এইচডি এস) (টিল এস) যেখানে "প্রাইম" স্ট্রিমগুলিতে প্রাইম অপারেশন প্রয়োগ করে প্রাপ্ত হয় (এনু 2)। উপরের স্বরলিপি অনুসরণ করে, মৌলিক সংখ্যার ক্রম (যার সাথে একটি থ্রোওয়ে 0 যুক্ত করা হয়েছে) এবং সংখ্যার প্রবাহগুলি ক্রমান্বয়ে ছেঁটে ফেলা হচ্ছে, যা হাস্কেল হিসাবে বা (\(p, s @(h: t))-> (h, চালনী ht) 'পুনরাবৃত্তি' (0, [2]) হিসাবে উপস্থাপন করা যেতে পারে। যদি প্রাথমিক প্রবাহ হিসাবে [5,10] দিয়ে ডাকা হয়। এখানে হাস্কেলের আরেকটি উদাহরণ রয়েছে। নিম্নলিখিত সংজ্ঞাটি রৈখিক সময়ে ফিবোনাচ্চি সংখ্যার তালিকা তৈরি করেঃ ফাইব = 0:1: জিপ-সহ (+) ফাইব (লেজ ফাইব) এই অসীম তালিকাটি অলস মূল্যায়নের উপর নির্ভর করে; উপাদানগুলি প্রয়োজনীয় ভিত্তিতে গণনা করা হয় এবং শুধুমাত্র সীমাবদ্ধ উপসর্গগুলি সর্বদা স্মৃতিতে স্পষ্টভাবে প্রতিনিধিত্ব করা হয়। এই বৈশিষ্ট্যটি কোডাটার অংশগুলিতে অ্যালগরিদমগুলিকে সমাপ্ত করার অনুমতি দেয়; এই ধরনের কৌশলগুলি হাস্কেল প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ। এটি পাইথনেও করা যেতে পারেঃ ইটার্টুলস থেকে আমদানি করা টি, চেইন, আইলিস, ইম্যাপ ডেফ অ্যাড (এক্স, ওয়াই): রিটার্ন এক্স + ওয়াই ডেফ ফাইবোনাচি (): ডেফ ডেফার্ড আউটপুট (): আউটপুটে আই-এর জন্যঃ ফলন আই ফলাফল, সি1, সি2 = টি (ডেফার্ড আউটপুট (), 3) পেয়ার্ড = ইম্যাপ (যোগ, সি1, আইলিস (সি2,1, কিছুই নয়)) আউটপুট = চেইন ([0,1], পেয়ার্ড) আইলিসে আই-এর জন্য রিটার্ন ফলাফল (ফাইবোনাচি (), 20): প্রিন্ট (i) জিপের সংজ্ঞা-সহ ইনলাইন করা যেতে পারে, যার ফলে ফাইব = 0 হয়। সাধারণ পুনরাবৃত্তি স্ব-রেফারেন্সিয়াল ফাংশন ব্যবহার করে, তবে স্ব-রেফারেন্সিয়াল ডেটা সামঞ্জস্য করে না। যাইহোক, ফিবোনাচির উদাহরণের জন্য এটি অপরিহার্য নয়। এটি নিম্নরূপ পুনর্লিখন করা যেতে পারেঃ ফাইব = ফাইবজেন (0,1) ফাইবজেন (x, y) = x: ফাইবজেন (y, x + y) এটি ফলাফল গঠনের জন্য শুধুমাত্র স্ব-রেফারেন্সিয়াল ফাংশন নিযুক্ত করে। যদি এটি কঠোর তালিকা নির্মাণকারীর সাথে ব্যবহার করা হয় তবে এটি রানওয়ে পুনরাবৃত্তির একটি উদাহরণ হবে, তবে অ-কঠোর তালিকা নির্মাণকারীর সাথে এই সুরক্ষিত পুনরাবৃত্তি ধীরে ধীরে একটি অনির্দিষ্টকালের জন্য সংজ্ঞায়িত তালিকা তৈরি করে। কোরকার্সন একটি অসীম বস্তু তৈরি করতে হবে না; একটি কোরকার্সিভ সারি এই ঘটনার একটি বিশেষ ভাল উদাহরণ। নিম্নলিখিত সংজ্ঞাটি রৈখিক সময়ে উপর থেকে নিচের দিকে একটি বাইনারি গাছের প্রস্থ তৈরি করে (ইতিমধ্যে উপরে উল্লিখিত সমতলকরণকে অন্তর্ভুক্ত করে): তথ্য বৃক্ষ a b = পাতা a। শাখা b (বৃক্ষ a b) (বৃক্ষ a b) bftrav: বৃক্ষ a b-> [বৃক্ষ a b] bftrav গাছ = গাছঃ ts যেখানে ts = জেন 1 (বৃক্ষঃ ts) জেন 0 পি = [] জেন লেন (পাতা p) = জেন (লেন-1) পি জেন লেন (শাখা r: p) = l: r: জেন (লেন + 1) পি---------------------------------------------------------------------------- এই তালিকাটি ইনপুট সারি এবং ফলাফল উভয় হিসাবে দ্বৈত উদ্দেশ্য সাধন করে (জেন লেন পি তালিকা বরাবর তার ইনপুট ব্যাক-পয়েন্টার, পি, এর আগে তার আউটপুট লেন নোট তৈরি করে)। এটি সীমাবদ্ধ যদি এবং শুধুমাত্র যদি প্রাথমিক গাছটি সীমাবদ্ধ হয়। সমাপ্তি নিশ্চিত করার জন্য সারির দৈর্ঘ্য অবশ্যই স্পষ্টভাবে ট্র্যাক করতে হবে; এই সংজ্ঞাটি শুধুমাত্র অসীম গাছের ক্ষেত্রে প্রয়োগ করা হলে এটি নিরাপদে বাদ দেওয়া যেতে পারে। এই হাস্কেল কোডটি স্ব-রেফারেন্সিয়াল ডেটা স্ট্রাকচার ব্যবহার করে, তবে মূলত অলস মূল্যায়নের উপর নির্ভর করে না। এটি সরাসরি অনুবাদ করা যেতে পারে যেমন। প্রোলগ যা অলস ভাষা নয়। যা অপরিহার্য তা হল উপরে-নিচে পদ্ধতিতে একটি তালিকা (সারি হিসাবে ব্যবহৃত) তৈরি করার ক্ষমতা। এর জন্য, প্রোলগের লেজ পুনরাবৃত্তি মডুলো কনস রয়েছে (অর্থাৎ। সমাপ্ত তালিকা খুলুন)। যা স্কিম, সি ইত্যাদিতেও অনুকরণযোগ্য। পরিবর্তনীয় লেজ প্রহরী নির্দেশকের সাথে সংযুক্ত তালিকা ব্যবহার করেঃ bftrav (বৃক্ষ, [Tree|TS]):-bfgen (1, [Tree|TS], TS)। bfgen (0, _, []):-! সারিতে% 0 এন্ট্রি-- bfgen (N, [লিফ (_) |P, TS) তালিকাটি বন্ধ করুনঃ-- N2 হল N-1, bfgen (N2, P, TS)। bfgen (N, [শাখা (_, L, R) |P], [L, R|TS]:-N2 হল N + 1, bfgen (N2, P, TS)। %%-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ফাংশন লেবেলটি একটি বাইনারি ট্রি-র প্রতিটি নোডে প্রথমে প্রস্থে যায়, প্রতিটি লেবেলকে একটি পূর্ণসংখ্যা দিয়ে প্রতিস্থাপন করে, প্রতিটি পরবর্তী পূর্ণসংখ্যা শেষটির চেয়ে 1 দ্বারা বড় হয়। এই সমাধানটি একটি স্ব-রেফারেন্সিয়াল ডেটা কাঠামো নিয়োগ করে এবং বাইনারি ট্রি সসীম বা অসীম হতে পারে। লেবেলঃঃ বৃক্ষ a b-> বৃক্ষ int int লেবেল t = টিএন যেখানে (টিএন, এনএস) = গো টি (1: এনএস) যানঃঃ বৃক্ষ a b-> [int]-> (বৃক্ষ int int, [int]) যান (লিফ _) (i: a) = (লিফ i, i + 1: a) যান (শাখা lr) (i: a) = (শাখা i ln rn, i + 1: c) যেখানে (ln, b) = গো l a (rn, c) = গো r b অথবা প্রোলগে, তুলনার জন্য, লেবেল (বৃক্ষ, টিএন):-লেবেল (বৃক্ষ, [1|Ns], Tn, Ns লেবেল (পাতা (_), [I|A], পাতা (I), [I + 1|A])। লেবেল (শাখা (_, L, R), [I|A], শাখা (I, Ln, Rn), [I + 1|C]:-লেবেল (L, A, Ln, B), লেবেল (R, B, Rn, C)। একটি অ্যাপোমর্ফিজম (যেমন একটি অ্যানামর্ফিজম, যেমন আনফ্লড) কোরকার্সনের একটি রূপ যা একইভাবে একটি প্যারামর্ফিজম (যেমন একটি ক্যাটামর্ফিজম, যেমন ভাঁজ) পুনরাবৃত্তির একটি রূপ। CoQ প্রুফ অ্যাসিস্ট্যান্ট কোফিক্সপয়েন্ট কমান্ড ব্যবহার করে কোরকারসন এবং কোইনডাকশন সমর্থন করে। ইতিহাস কোরকারসন, যা বৃত্তাকার প্রোগ্রামিং হিসাবে উল্লেখ করা হয়, কমপক্ষে তার তারিখ নির্ধারণ করে, যিনি জন হিউজেস এবং ফিলিপ ওয়াডলারকে কৃতিত্ব দেন; আরও সাধারণ রূপগুলি বিকশিত হয়েছিল। মূল অনুপ্রেরণাগুলির মধ্যে আরও দক্ষ অ্যালগরিদম তৈরি করা (কিছু ক্ষেত্রে একাধিক পাসের পরিবর্তে ডেটা পাস করার অনুমতি দেওয়া) এবং কার্যকরী ভাষায় দ্বিগুণ সংযুক্ত তালিকা এবং সারির মতো শাস্ত্রীয় ডেটা কাঠামো প্রয়োগ করা অন্তর্ভুক্ত ছিল। আরও দেখুন বিসিমুলেশন কোইনডাকশন রিকার্সন অ্যানামর্ফিজম নোটস রেফারেন্স তাত্ত্বিক কম্পিউটার বিজ্ঞান স্ব-রেফারেন্স নিবন্ধ উদাহরণ সহ হাস্কেল কোড নিবন্ধ উদাহরণ সহ পাইথন (প্রোগ্রামিং ভাষা) কোড সহ নিবন্ধ কার্যকরী প্রোগ্রামিং বিভাগ তত্ত্ব রিকার্সন