রুবিতে পুনরাবৃত্তি কি?
পুনরাবৃত্ত ফাংশনগুলি হল যেগুলি শেষ লক্ষ্যে না পৌঁছানো পর্যন্ত নিজেকে কল করতে থাকে (এটি বেস কেস নামেও পরিচিত ) প্রতিটি ফাংশন কলের পরে আপনি এই বেস কেসের দিকে অগ্রগতি করেন, বাকি কাজগুলি হ্রাস করে।
বেস কেস পৌঁছে গেলে, পুনরাবৃত্তি শেষ হয়, এবং ফাংশনগুলি ফিরে আসতে শুরু করে।
রুবি পুনরাবৃত্তি
পুনরাবৃত্তি সম্পর্কে শেখা শুরু করার একটি ক্লাসিক উদাহরণ হল একটি ফ্যাক্টরিয়াল সংখ্যা গণনা করা।
আসুন দেখি কিভাবে আমরা রুবিতে এটি পুনরাবৃত্তি এবং পুনরাবৃত্তি উভয় ব্যবহার করে করতে পারি!
একটি সংখ্যার ফ্যাক্টরিয়াল গণনা করতে আমাদের 1 থেকে আমাদের লক্ষ্য সংখ্যা পর্যন্ত সমস্ত সংখ্যাকে গুণ করতে হবে। উদাহরণস্বরূপ, 5 এর ফ্যাক্টরিয়াল হল:1 * 2 * 3 * 4 * 5 = 120
.
আসুন দেখি কিভাবে আমরা রুবি এবং রিকারশন ব্যবহার করে এটি করতে পারি।
উদাহরণ :
def iterative_factorial(n) (1..n).inject(:*)enddef recursive_factorial(n) # বেস কেস রিটার্ন 1 যদি n <=1 # রিকার্সিভ কল n * recursive_factorial(n-1)end
এই উদাহরণে আমি আপনাকে একটি ফ্যাক্টরিয়াল সংখ্যা গণনা করার দুটি উপায় দেখাই। পুনরাবৃত্তিমূলক এবং পুনরাবৃত্তিমূলক সমাধান।
পুনরাবৃত্ত সমাধানে আমরা যে সংখ্যার সাথে কাজ করছি তা হ্রাস করে অগ্রগতি করি (n-1)। একবার (n <=1) আর কোন পুনরাবৃত্ত কল নেই, এবং এটিই ঘটে:
<প্রি> রিটার্ন 1 # রিকারসিভ_ফ্যাক্টোরিয়াল(1) রিটার্ন 2 * 1 # রিকারসিভ_ফ্যাক্টোরিয়াল(2) রিটার্ন 3 * 2 # রিকারসিভ_ফ্যাক্টোরিয়াল(3) রিটার্ন 4 * 6 # রিকার্সিভ_ফ্যাক্টোরিয়াল(4) রিটার্ন 5 * 24 # রিকারসিভ)_ফ্যাক্টর (5)রুবি ডেভেলপার হিসাবে আমরা বেশিরভাগ সময় পুনরাবৃত্তিমূলক সমাধানের জন্য যাই, এবং এটি দুর্দান্ত, কিন্তু আমি মনে করি এটি কীভাবে পুনরাবৃত্তি কাজ করে তা জানা এখনও মূল্যবান৷
এখন আরেকটি ক্লাসিক উদাহরণ দেখা যাক:ফিবোনাচি সংখ্যা।
ফিবোনাচি সিকোয়েন্স
লিওনার্দো ফিবোনাচ্চি আদর্শ পরিস্থিতিতে খরগোশের জনসংখ্যার বৃদ্ধির মডেল কীভাবে তৈরি করা যায় তা অনুসন্ধান করার সময় এই ক্রমটি আবিষ্কার করেছিলেন৷
বর্তমান সংখ্যার আগে আসা দুটি সংখ্যা যোগ করে ক্রমটি গণনা করা হয়।
উদাহরণ :
1, 1, 2, 3, 5, 8, 13, 21
রুবিতে এটি গণনা করতে আপনি একটি পুনরাবৃত্ত ফাংশন ব্যবহার করতে পারেন:
def fib(n) রিটার্ন n যদি n <2 fib(n-1) + fib(n-2)end
এই ফাংশন এবং একটি পরিসর ব্যবহার করে আপনি সহজেই প্রথম 20টি ফিবোনাচি সংখ্যা গণনা করতে পারেন৷
(1..20).প্রতিটি { |n| fib(n)রাখে
তবে, একটি সমস্যা আছে :
আপনার ফাংশনটি অনেক অতিরিক্ত কাজ করছে যা এটির প্রয়োজন নেই। এটি ব্যাখ্যা করার জন্য, নিম্নলিখিত চিত্রটি দেখুন।
ছবিতে আমরা দেখতে পাচ্ছি কিভাবে fib(3) পাঁচবার গণনা করা হয়। আপনি যদি দীর্ঘ ফিবোনাচি ক্রম গণনা করার চেষ্টা করেন তবে এটি আপনার কার্যকারিতাকে সত্যিই ধীর করে তোলে।
সমাধান? স্মৃতিচারণ।
স্মরণীয়করণ:আমরা ইতিমধ্যে সম্পন্ন করেছি কাজ পুনরায় ব্যবহার করা
আপনি যদি পূর্ববর্তী ধাপে ইতিমধ্যেই করা কাজটি পুনরায় ব্যবহার করতে পারেন তবে এটি কি দুর্দান্ত হবে না?
আমরা স্মরণীয়করণ ব্যবহার করে এটি করতে পারি .
আমাদের ব্যয়বহুল গণনার ফলাফল সংরক্ষণ করতে আমরা একটি ক্যাশে ব্যবহার করি। এই ক্ষেত্রে, একটি অ্যারে করবে৷
৷উদাহরণ :
@cache =[0,1]def fib(n) রিটার্ন @cache[n] যদি @cache[n] @cache[n] =fib(n-1) + fib(n-2)end
প্রথমে আমরা পরীক্ষা করি যে ফলাফলটি ইতিমধ্যেই ক্যাশে আছে কিনা, যদি এটি থাকে তবে তা ফেরত দিন, অন্যথায় আমরা গণনা করি এবং ফলাফল সংরক্ষণ করি।
এটি অনেক দ্রুত চলবে এবং এটি অনেক বড় ফিবোনাচি সংখ্যা গণনা করতে সক্ষম হবে৷
পুনরাবৃত্তির সীমা
একজন পাঠক অনুগ্রহপূর্বক উল্লেখ করেছেন, পুনরাবৃত্তিমূলক সমাধানটি SystemStackError: stack level too deep
এর সাথে ব্যর্থ হতে পারে বড় ইনপুট সংখ্যা সহ (প্রায় 7500, সঠিক সংখ্যা আপনার সিস্টেমের উপর নির্ভর করে)।
আপনি যদি আরও বড় সংখ্যা গণনা করতে চান তবে আপনাকে একটি পুনরাবৃত্তিমূলক সমাধান ব্যবহার করতে হবে।
উদাহরণ :
মেমো =[](0..n).প্রতিটি করতে |i| মেমো[i] =i <2? i :মেমো[i-1] + মেমো[i-2]শেষ
উপসংহার
পুনরাবৃত্তি দুর্দান্ত কিন্তু কখনও কখনও এটি উপলব্ধি করা কঠিন হতে পারে। এখন আপনার পালা, অনুশীলন দক্ষতা অর্জন করে!
যদি আপনি এটি পছন্দ করেন তাহলে এই পোস্টটি শেয়ার করুন এবং আমার নিউজলেটার সাবস্ক্রাইব করুন 🙂