রিকর্শন (Recursion) হল একটি প্রোগ্রামিং কৌশল যেখানে একটি ফাংশন নিজেকে কল (call) করে, এবং এটি সাধারণত সমস্যা সমাধানে ছোট উপ-সমস্যা গুলিকে পুনরাবৃত্তি (repeatedly) সমাধান করার জন্য ব্যবহৃত হয়। রিকার্শন একটি সমস্যার সমাধানকে একই ধরনের ছোট উপ-সমস্যায় ভেঙে দিয়ে সমাধান করে।
রিকার্শনের মৌলিক ধারণা
রিকর্ষনের মূল ধারণা হল, যখন একটি ফাংশন নিজেকে কল করে, তখন সে নিজে থেকে সমস্যাটি সহজভাবে সমাধান করার চেষ্টা করে। এটি বিশেষভাবে তখন ব্যবহারী হয়, যখন কোনো সমস্যা পুনরাবৃত্তি (repeated) গঠনে থাকে বা উপ-সমস্যাগুলিতে একই ধরনের পদক্ষেপ গ্রহণ করা যায়।
রিকর্ষনের একটি গুরুত্বপূর্ণ দিক হল বেস কেস (base case) এবং **রিকার্শন কেস (recursive case)**।
- বেস কেস: এটি সেই শর্ত যেখানে রিকার্শন থামে। যদি বেস কেস না থাকে, তবে রিকার্শন আনলিমিটেড (infinite) হতে পারে।
- রিকার্শন কেস: এটি সেই শর্ত যেখানে ফাংশন নিজেকে পুনরায় কল করে।
রিকার্শন এর ব্যবহার
রিকার্শন এমন কিছু সমস্যায় কার্যকরী হয়, যেগুলির সমাধানে একই ধরণের সমস্যা বার বার উৎপন্ন হয়। কিছু সাধারণ ব্যবহারিক ক্ষেত্রে রিকার্শন ব্যবহৃত হয়:
ফ্যাক্টোরিয়াল (Factorial) গণনা:
ফ্যাক্টোরিয়াল হল একটি সংখ্যার সব পূর্ণসংখ্যা গুণফল। এটি রিকার্শনের মাধ্যমে খুব সহজে গণনা করা যেতে পারে।উদাহরণ:
- ফ্যাক্টোরিয়াল: \( n! = n \times (n-1) \times (n-2) \times \dots \times 1 \)
- ফ্যাক্টোরিয়াল রিকার্শন ফাংশন: \( n! = n \times (n-1)! \)
program FactorialExample;
function Factorial(n: Integer): Integer;
begin
if n = 0 then
Factorial := 1 // বেস কেস: 0! = 1
else
Factorial := n * Factorial(n - 1); // রিকার্শন কেস
end;
begin
writeln('Factorial of 5 is ', Factorial(5)); // আউটপুট: 120
end.এখানে:
- বেস কেস: যদি \( n = 0 \), তখন ফ্যাক্টোরিয়াল ১ ফেরত দেয়া হয়।
- রিকার্শন কেস: যদি \( n > 0 \), তবে ফাংশন নিজেকে কল করে এবং \( n \times (n-1)! \) হিসাব করে।
ফিবোনাচ্চি (Fibonacci) সিরিজ:
ফিবোনাচ্চি সিরিজের প্রতিটি সংখ্যা পূর্ববর্তী দুইটি সংখ্যার যোগফল। এটি রিকার্শনের মাধ্যমে সমাধান করা যায়।উদাহরণ:
- ফিবোনাচ্চি সিরিজের সূত্র: \( F(n) = F(n-1) + F(n-2) \)
- বেস কেস: \( F(0) = 0, F(1) = 1 \)
program FibonacciExample;
function Fibonacci(n: Integer): Integer;
begin
if n = 0 then
Fibonacci := 0 // বেস কেস
else if n = 1 then
Fibonacci := 1 // বেস কেস
else
Fibonacci := Fibonacci(n - 1) + Fibonacci(n - 2); // রিকার্শন কেস
end;
begin
writeln('Fibonacci of 6 is ', Fibonacci(6)); // আউটপুট: 8
end.এখানে:
- বেস কেস: \( F(0) = 0 \) এবং \( F(1) = 1 \)
- রিকার্শন কেস: \( F(n) = F(n-1) + F(n-2) \)
- লিঙ্কড লিস্ট (Linked List) Traversal:
একটি লিঙ্কড লিস্টের উপাদানগুলোকে রিকার্শনের মাধ্যমে পর্যায়ক্রমে দেখা বা প্রক্রিয়া করা যায়।
program LinkedListTraversal;
type
NodePtr = ^Node;
Node = record
data: Integer;
next: NodePtr;
end;
var
head: NodePtr;
procedure PrintList(node: NodePtr);
begin
if node <> nil then
begin
writeln(node^.data); // নোডের মান প্রিন্ট করা
PrintList(node^.next); // রিকার্শন: পরবর্তী নোডে কল করা
end;
end;
begin
{ এখানে লিঙ্কড লিস্টের প্রাথমিক নোডগুলি তৈরি করা হয় }
new(head);
head^.data := 1;
new(head^.next);
head^.next^.data := 2;
new(head^.next^.next);
head^.next^.next^.data := 3;
head^.next^.next^.next := nil;
PrintList(head); // আউটপুট: 1, 2, 3
end.এখানে:
- বেস কেস: যদি নোডের পরবর্তী অংশ
nilহয়, তখন রিকার্শন থেমে যায়। - রিকার্শন কেস: যদি নোডের পরবর্তী অংশ
nilনা হয়, তাহলে পরবর্তী নোডে রিকার্শন কল করা হয়।
রিকার্শন এর সুবিধা
- সহজ কোড: অনেক জটিল সমস্যা সহজেই রিকার্শন দিয়ে সমাধান করা যায়। উদাহরণস্বরূপ, ফ্যাক্টোরিয়াল বা ফিবোনাচ্চি সিরিজ।
- প্রাকৃতিক উপস্থাপনা: অনেক সমস্যা যেমন গাছ (Tree) বা গ্রাফ (Graph) কাঠামো, রিকার্শন দিয়ে খুব প্রাকৃতিকভাবে উপস্থাপন করা যায়।
- ডাটা স্ট্রাকচারগুলির জন্য উপকারী: যেমন লিঙ্কড লিস্ট, ট্রি ইত্যাদি ডাটা স্ট্রাকচার গুলির জন্য রিকার্শন খুবই উপকারী।
রিকার্শন এর সীমাবদ্ধতা
- স্ট্যাক ওভারফ্লো: যদি রিকার্শন সঠিকভাবে থামানো না হয়, তাহলে এটি স্ট্যাকের সীমা পার করতে পারে, যা প্রোগ্রামের ক্র্যাশ বা স্ট্যাক ওভারফ্লো ঘটাতে পারে।
- অতিরিক্ত মেমরি ব্যবহার: প্রতিটি রিকার্শন কলের জন্য মেমরির প্রয়োজন হয়, যা অনেক রিকার্শন কলের ফলে মেমরি বেশি খরচ হতে পারে।
সারাংশ
রিকার্শন হল একটি শক্তিশালী প্রোগ্রামিং কৌশল যা একটি ফাংশনকে নিজেকে কল করতে দেয়। এটি সমস্যা সমাধানের একটি কার্যকরী উপায়, বিশেষ করে সেইসব সমস্যা যেখানে সমস্যা এবং তার উপ-সমস্যাগুলি একই ধরনের। তবে, এটি ব্যবহার করার সময় বেস কেস ঠিকভাবে নির্ধারণ করা এবং স্ট্যাক ওভারফ্লো এড়াতে সতর্ক থাকা প্রয়োজন।
Read more