ইটারেশন (Iteration) এবং রিকারশন (Recursion) প্রোগ্রামিংয়ের দুটি গুরুত্বপূর্ণ পদ্ধতি যা আমরা কোনো সমস্যার সমাধান করার সময় ব্যবহার করি। এগুলো আসলে কোনো কাজ বারবার করা বা পুনরাবৃত্তি করার উপায়, তবে দুটির মধ্যে কাজ করার পদ্ধতিতে পার্থক্য রয়েছে। গল্পের মাধ্যমে সহজভাবে এই দুটি কনসেপ্ট বুঝানোর চেষ্টা করি।
গল্প: পাহাড়ে চড়ার দুটি পদ্ধতি
প্রেক্ষাপট:
তুমি একটি পাহাড়ের চূড়ায় উঠতে চাও। তোমার কাছে দুটি পদ্ধতি আছে।
১. ইটারেশন (Iteration): তুমি ধাপে ধাপে পাহাড়ের প্রতিটি ধাপ পার করে চূড়ায় উঠবে। ২. রিকারশন (Recursion): তুমি প্রতিটি ধাপে উঠতে নিজেই নিজেকে ডাকবে এবং আগের ধাপের সমাধান ব্যবহার করে পরের ধাপ পার হবে।
১. ইটারেশন (Iteration)
গল্প: ধাপে ধাপে পাহাড়ে চড়া
তুমি পাহাড়ের নিচ থেকে ধীরে ধীরে প্রতিটি ধাপ গুনে গুনে উঠতে থাকো। ধরো পাহাড়ে ১০০ ধাপ আছে। তুমি একবারে ১ ধাপ করে উঠবে এবং প্রতিটি ধাপ তোমার জন্য নতুন একটি লেভেল।
- প্রথম ধাপে তুমি উঠে ১ লিখে রাখলে, এরপর ২য় ধাপে উঠো এবং লিখে ফেলো ২।
- এভাবে তুমি ১০০তম ধাপ পর্যন্ত উঠতে থাকো।
এই প্রক্রিয়াটি ইটারেশন। অর্থাৎ, তুমি একই কাজ বারবার করছো, কিন্তু প্রতিবার নতুন ধাপে উঠতে তোমার আগের ধাপের কোনো সম্পর্ক বা রেফারেন্স দরকার হচ্ছে না। তুমি ধাপে ধাপে গুনে গুনে উপরে উঠছো।
প্রোগ্রামিং উদাহরণ:
ধরা যাক, তুমি ১ থেকে ১০ পর্যন্ত সংখ্যা প্রিন্ট করতে চাও। তুমি এটা লুপ (ইটারেশন) ব্যবহার করে করতে পারো:
for i in range(1, 11):
print(i)
এখানে প্রতিবার লুপ চালিয়ে তুমি ১ থেকে ১০ পর্যন্ত সংখ্যা প্রিন্ট করছো, একবার করে সংখ্যা বাড়ছে।
২. রিকারশন (Recursion)
গল্প: নিজেকে ডাকতে ডাকতে পাহাড়ে চড়া
এবার তুমি ঠিক করলে, একবারে সব ধাপ গুনে না উঠে, প্রতিটি ধাপে উঠার জন্য নিজেকে প্রতিবার ডেকে ডেকে উঠবে।
- প্রথম ধাপে তুমি নিজেকে বলবে, “আমাকে ১০০ ধাপে উঠতে হবে, প্রথম ধাপে উঠে আমাকে ৯৯ ধাপে উঠার জন্য আবার ডেকো।”
- তুমি প্রথম ধাপে উঠলে আবার নিজেকে ডাকবে, এবার বলবে, “৯৯ ধাপে উঠতে হবে, আবার আমাকে ডেকো।”
- এভাবে প্রতিবার তুমি নিজেকে ডেকে ডেকে পরের ধাপে উঠবে, যতক্ষণ না তুমি শেষ ধাপে পৌঁছাও।
এটাই হলো রিকারশন। এখানে প্রতিটি ধাপ নিজেকে ডাকার মাধ্যমে সম্পন্ন হচ্ছে, এবং প্রতিটি ধাপ আগের ধাপের উপর নির্ভরশীল।
প্রোগ্রামিং উদাহরণ:
এবার ধরো, তুমি ১ থেকে ১০ পর্যন্ত সংখ্যা প্রিন্ট করতে চাও কিন্তু এবার রিকারশন ব্যবহার করবে:
def print_numbers(n):
if n > 0:
print_numbers(n - 1)
print(n)
print_numbers(10)
এখানে, প্রতিবার ফাংশনটি নিজেকে ডেকে নিজে কাজ করছে। প্রথমে ফাংশনটি ১০ বার নিজেকে ডাকে এবং তারপর প্রতিটি কল শেষ করে ১ থেকে ১০ পর্যন্ত সংখ্যা প্রিন্ট করে।
ইটারেশন বনাম রিকারশন: পার্থক্য কী?
১. ইটারেশন:
- তুমি ধাপে ধাপে কাজ করো, এবং প্রতিটি ধাপ আলাদা।
- কোনো ধাপে যেতে আগের ধাপের সাহায্য লাগে না।
- সাধারণত কম মেমোরি লাগে, কারণ প্রতিবার নতুন কিছু মনে রাখতে হয় না।
উদাহরণ:
ধরে নাও, তুমি ১০০ জন মানুষের একটি লাইন থেকে প্রতিজনকে একে একে ডেকে নাম বলতে বলছো। সবাইকে একবার করে নাম বলতে বললেই তোমার কাজ শেষ।
২. রিকারশন:
- তুমি প্রতিবার নিজেকে ডেকে পরের ধাপে যাও।
- প্রতিটি ধাপের সমাধান আগের ধাপের উপর নির্ভরশীল।
- বেশি মেমোরি লাগে, কারণ প্রতিবার মনে রাখতে হয় আগের ধাপ কী ছিল।
উদাহরণ:
ধরে নাও, তুমি ১০০ জন মানুষকে বলছো, “প্রথমে আমাকে প্রথম জনের নাম বলো, এরপর সে আমাকে পরের জনের নাম বলবে।” এভাবে তুমি শেষ পর্যন্ত যেতে থাকবে যতক্ষণ না তুমি শেষ জনের নাম পাও।
বাস্তব জীবনের উদাহরণ:
ইটারেশন:
ধরা যাক, তুমি একটা বড় লিস্ট থেকে নাম্বার গুলোকে সাজানোর জন্য একে একে তুলনা করে সঠিক জায়গায় রাখছো। এটা ইটারেটিভ প্রক্রিয়া। যেমনঃ Bubble Sort।
রিকারশন:
ধরা যাক, তুমি একটি ফাইল ফোল্ডারের ভেতরে অনেক সাবফোল্ডার আছে। প্রত্যেকটি ফোল্ডারের ভিতরে ঢুকে সাবফোল্ডার থেকে সব ফাইল খুঁজতে হবে। তুমি প্রতিটি ফোল্ডারের ভিতরে ঢুকে সাবফোল্ডারগুলো খুলে খুঁজতে থাকবে যতক্ষণ না সব ফাইল পেয়ে যাও। এটা হলো Recursive Search।
উপসংহার:
- ইটারেশন হলো সরাসরি ধাপে ধাপে কাজ করা, যেখানে আমরা সাধারণত লুপ ব্যবহার করি।
- রিকারশন হলো নিজের উপর নির্ভর করে কাজ করা, যেখানে একটি ফাংশন নিজেকেই বারবার ডেকে কাজ সম্পন্ন করে।
এই গল্পগুলো ব্যবহার করে আশা করি তুমি ইটারেশন এবং রিকারশন সম্পর্কে পরিষ্কার ধারণা পেয়েছ।