রিকার্সন হলো প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ কৌশল, যেখানে একটি ফাংশন নিজেই নিজেকে কল করে এবং একটি নির্দিষ্ট শর্তে পৌঁছালে কল বন্ধ হয়। এই শর্তকে বেস কেস (base case) বলা হয়। রিকার্সন ব্যবহার করে জটিল সমস্যাগুলিকে সহজভাবে সমাধান করা যায়, বিশেষ করে যখন সমস্যাগুলি ছোট ছোট অংশে বিভক্ত করা সম্ভব হয়।
রিকার্সনের বৈশিষ্ট্য
১. বেস কেস: রিকার্সিভ ফাংশনের এমন একটি অবস্থা, যখন ফাংশন আর নিজেকে কল করবে না এবং সরাসরি ফলাফল প্রদান করবে। ২. রিকার্সিভ কেস: যেখানে ফাংশন নিজেকে কল করে ছোট অংশে বিভক্ত করে সমস্যার সমাধান করে।
উদাহরণ: ফ্যাক্টরিয়াল গণনা
ফ্যাক্টরিয়াল হলো একটি পূর্ণসংখ্যার গুণফল যা ঐ সংখ্যার আগের সমস্ত সংখ্যা দ্বারা গুণ করা হয়। যেমন, 5!=5×4×3×2×1=1205! = 5 \times 4 \times 3 \times 2 \times 1 = 1205!=5×4×3×2×1=120।
ফ্যাক্টরিয়াল রিকার্সিভ ফাংশনের মাধ্যমে:
কোড:
#include <stdio.h>
// রিকার্সিভ ফাংশন
int factorial(int n) {
if (n == 0 || n == 1) { // বেস কেস
return 1;
} else {
return n * factorial(n - 1); // রিকার্সিভ কল
}
}
int main() {
int num = 5;
printf("Factorial of %d is: %d\n", num, factorial(num));
return 0;
}
আউটপুট:
Factorial of 5 is: 120
ব্যাখ্যা: factorial ফাংশনটি নিজেকে বারবার কল করে যতক্ষণ না n এর মান ১ বা ০ হয়। এই শর্তটি বেস কেস হিসেবে কাজ করে এবং তখন ১ রিটার্ন করে।
রিকার্সনের প্রয়োগ
রিকার্সন প্রোগ্রামিংয়ের বিভিন্ন ক্ষেত্রে ব্যবহৃত হয়, যেমন:
- ফ্যাক্টরিয়াল গণনা: যেমন উপরে দেখানো হয়েছে।
- ফিবোনাচ্চি সিরিজ: ফিবোনাচ্চি সিরিজে প্রতিটি সংখ্যা পূর্ববর্তী দুটি সংখ্যার যোগফল।
- গণিতের সমস্যাগুলি সমাধান: যেমন পাওয়ার (power) গণনা, গড়, ম্যাক্সিমাম-সাম্ভাবনা প্রভৃতি।
- ডাটা স্ট্রাকচার ট্রাভার্সাল: যেমন বাইনারি ট্রি বা গ্রাফের ট্রাভার্সালে।
- বাইনারি সার্চ: পুনরাবৃত্তি করে ছোট ছোট অংশে বিভক্ত করে দ্রুত অনুসন্ধান।
- হ্যানয় টাওয়ার সমস্যার সমাধান: রিকার্সিভ কৌশলে জটিল সমস্যা সমাধানে ব্যবহৃত হয়।
উদাহরণ: ফিবোনাচ্চি সিরিজ
ফিবোনাচ্চি সিরিজে প্রতিটি সংখ্যা তার আগের দুটি সংখ্যার যোগফল।
ফিবোনাচ্চি সিরিজের জন্য রিকার্সিভ ফাংশন:
F(n)=F(n−1)+F(n−2)যেখানে, F(0)=0 এবং F(1)=1F(n) = F(n-1) + F(n-2) \quad \text{যেখানে, } F(0) = 0 \text{ এবং } F(1) = 1F(n)=F(n−1)+F(n−2)যেখানে, F(0)=0 এবং F(1)=1
কোড:
#include <stdio.h>
int fibonacci(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2); // রিকার্সিভ কল
}
}
int main() {
int terms = 10;
printf("Fibonacci Series: ");
for (int i = 0; i < terms; i++) {
printf("%d ", fibonacci(i));
}
return 0;
}
আউটপুট:
Fibonacci Series: 0 1 1 2 3 5 8 13 21 34
রিকার্সনের সুবিধা এবং অসুবিধা
সুবিধা:
- জটিল সমস্যার সমাধান সহজভাবে করা যায়।
- ডাটা স্ট্রাকচার যেমন ট্রি, গ্রাফ ইত্যাদির ক্ষেত্রে সহজে প্রয়োগ করা যায়।
- প্রোগ্রামের লজিক বোঝা এবং লিখা সহজ হয়।
অসুবিধা:
- অতিরিক্ত মেমোরি ব্যবহার হয়, কারণ প্রতিটি রিকার্সিভ কল স্ট্যাক মেমোরি দখল করে।
- যদি বেস কেস ঠিকমতো সংজ্ঞায়িত না হয়, তবে প্রোগ্রাম ইনফাইনাইট লুপে চলে যেতে পারে।
- বড় ইনপুটের ক্ষেত্রে রিকার্সন কার্যকর নাও হতে পারে এবং টাইম কমপ্লেক্সিটি বেড়ে যায়।
রিকার্সন প্রোগ্রামিংকে আরও সংক্ষিপ্ত ও কার্যকর করতে পারে, তবে এটি ব্যবহারের ক্ষেত্রে সাবধানতা অবলম্বন করা গুরুত্বপূর্ণ।
Read more