Recursive Function এমন একটি ফাংশন যা নিজেই নিজেকে কল করে। এটি সাধারণত কোন সমস্যার ছোট উপ-সমস্যাগুলিতে বিভক্ত করার জন্য ব্যবহৃত হয় এবং প্রতিটি উপ-সমস্যার সমাধান শেষ হওয়ার পর মূল সমস্যার সমাধান করা হয়।
Rexx ভাষায় রিকর্সিভ ফাংশন ব্যবহার করা খুবই সহজ, কারণ Rexx ফাংশনগুলি অন্য ফাংশন বা স্ক্রিপ্টের মধ্যে সহজেই কল করা যায়। তবে, রিকর্সিভ ফাংশনের জন্য একটি বেস কেস (base case) থাকা অত্যন্ত গুরুত্বপূর্ণ, যাতে তা ইনফিনিট রিকার্সন থেকে রক্ষা পায়।
Recursive Function-এর সাধারণ গঠন:
function functionName
if condition then return value
else return functionName(arguments)এখানে:
- condition: এটি বেস কেস যা রিকার্সন থামাতে সাহায্য করবে।
- functionName(arguments): এটি ফাংশনের রিকার্সিভ কল যা সমস্যাটিকে ছোট অংশে ভাগ করে পুনরায় কল করা হয়।
উদাহরণ ১: ফ্যাক্টোরিয়াল (Factorial) ফাংশন
ফ্যাক্টোরিয়াল হল একটি সংখ্যার সমস্ত সংখ্যার গুণফল, যেমন \(n! = n \times (n-1) \times (n-2) \times \dots \times 1\)। ফ্যাক্টোরিয়াল ক্যালকুলেট করার জন্য একটি রিকর্সিভ ফাংশন ব্যবহার করা যেতে পারে।
রিকর্সিভ ফাংশন উদাহরণ:
factorial: procedure
parse arg n
if n = 0 then return 1
return n * factorial(n - 1)
result = factorial(5)
say resultএটি ফ্যাক্টোরিয়াল ৫ এর হিসাব করবে।
ব্যাখ্যা:
- base case:
if n = 0 then return 1— যখনn০ হয়, তখন ফ্যাক্টোরিয়াল ১ রিটার্ন করবে, কারণ \(0! = 1\)। - recursive case:
return n * factorial(n - 1)— ফাংশন নিজেই নিজের কল করেn - 1এর জন্য ফ্যাক্টোরিয়াল হিসাব করে।
আউটপুট:
120কারণ \( 5! = 5 \times 4 \times 3 \times 2 \times 1 = 120 \)
উদাহরণ ২: ফিবোনাচ্চি সিরিজ (Fibonacci Series)
ফিবোনাচ্চি সিরিজে প্রতিটি সংখ্যার মান হলো পূর্ববর্তী দুইটি সংখ্যার যোগফল, যেমন:
- \( F(0) = 0 \)
- \( F(1) = 1 \)
- \( F(n) = F(n-1) + F(n-2) \) (যখন \( n > 1 \))
রিকর্সিভ ফাংশন উদাহরণ:
fibonacci: procedure
parse arg n
if n = 0 then return 0
if n = 1 then return 1
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(6)
say resultব্যাখ্যা:
- base case:
if n = 0 then return 0এবংif n = 1 then return 1— যখন \(n = 0\) বা \(n = 1\) হবে, তখন যথাক্রমে ০ এবং ১ রিটার্ন হবে। - recursive case:
return fibonacci(n - 1) + fibonacci(n - 2)— ফিবোনাচ্চি সংখ্যা খুঁজতে ফাংশন নিজেই দুটি উপ-ফাংশন কল করে।
আউটপুট:
8কারণ \( F(6) = F(5) + F(4) = 5 + 3 = 8 \)
উদাহরণ ৩: নিউমেরিকাল সিকোয়েন্স (Numerical Sequence)
ধরা যাক, আপনি এমন একটি সিকোয়েন্স তৈরি করতে চান যেখানে প্রতিটি পরবর্তী সংখ্যা পূর্ববর্তী সংখ্যার দ্বিগুণ। উদাহরণস্বরূপ, \( S(0) = 1, S(n) = 2 \times S(n-1) \)।
রিকর্সিভ ফাংশন উদাহরণ:
sequence: procedure
parse arg n
if n = 0 then return 1
return 2 * sequence(n - 1)
result = sequence(4)
say resultব্যাখ্যা:
- base case:
if n = 0 then return 1— যখন \(n = 0\), তখন রিটার্ন হবে ১। - recursive case:
return 2 * sequence(n - 1)— পরবর্তী সংখ্যার মান ক্যালকুলেট করতে ফাংশন নিজে নিজেকে কল করবে।
আউটপুট:
16কারণ \( S(4) = 2 \times S(3) = 2 \times (2 \times S(2)) = 2 \times (2 \times (2 \times S(1))) = 2 \times (2 \times (2 \times 1)) = 16 \)
রিকর্সন সম্পর্কিত কিছু গুরুত্বপূর্ণ টিপস:
- বেস কেস (Base Case): রিকর্সন নিশ্চিতভাবে থামানোর জন্য একটি বেস কেস থাকতে হবে। যদি বেস কেস না থাকে, তাহলে ইনফিনিট রিকার্সন হবে।
- স্ট্যাক ওভারফ্লো: রিকার্সন খুব গভীর হলে স্ট্যাক মেমরি পূর্ণ হয়ে যেতে পারে এবং স্ট্যাক ওভারফ্লো ঘটতে পারে। এজন্য রিকার্সনের গভীরতা সীমাবদ্ধ রাখার চেষ্টা করুন।
- পারফরম্যান্স: কিছু রিকর্সিভ ফাংশন খুব দ্রুত অ্যাক্সেস হতে পারে, কিন্তু বড় ইনপুটের জন্য পারফরম্যান্স সমস্যাও সৃষ্টি করতে পারে। এগুলোর কার্যকারিতা উন্নত করার জন্য মেমোইজেশন বা ডাইনামিক প্রোগ্রামিং ব্যবহার করা যেতে পারে।
সারাংশ:
Rexx-এ রিকর্সিভ ফাংশন ব্যবহার করে জটিল সমস্যাগুলি সহজ উপ-সমস্যায় ভেঙে সমাধান করা সম্ভব। তবে রিকর্সন ব্যবহারের সময় সঠিক বেস কেস সেট করা খুবই গুরুত্বপূর্ণ, যাতে তা ইনফিনিট রিকার্সন থেকে বাঁচে।
Read more