রিকারশন এবং রিকার্সিভ প্রসিডিউরস (Recursion and Recursive Procedures in Fortran)
রিকারশন (Recursion) হলো একটি প্রোগ্রামিং কৌশল যেখানে একটি ফাংশন বা প্রসিডিউর নিজেই নিজেকে কল করে। এটি বিশেষভাবে উপকারী যখন সমস্যার সমাধানটি ছোট উপসমস্যায় বিভক্ত করা যায় এবং উপসমস্যাগুলির সমাধান একে অপরের সাথে সম্পর্কিত থাকে। ফোরট্রান-এ রিকারশন ব্যবহার করা হয় সাধারণত গণনা সম্পর্কিত বা সমস্যাগুলি পুনরাবৃত্তির মাধ্যমে সমাধান করতে।
১. রিকারশন কী এবং এটি কিভাবে কাজ করে?
রিকারশন হল একটি প্রক্রিয়া যেখানে একটি ফাংশন বা প্রসিডিউর নিজেই নিজেকে কল করে। একটি রিকার্সিভ ফাংশন সাধারণত একটি "বেস কেস" থাকে, যা প্রোগ্রামটির পুনরাবৃত্তি থামানোর শর্ত নির্ধারণ করে। বেস কেস ছাড়া, এটি নিজেই নিজেকে পুনরায় কল করে সমস্যাটির smaller version সমাধান করে।
২. রিকার্সিভ ফাংশন (Recursive Function)
রিকারসিভ ফাংশন বা প্রসিডিউর সাধারণত দুটি অংশ নিয়ে গঠিত:
- বেস কেস (Base Case): এটি সেই শর্ত যা রিকার্সনের পুনরাবৃত্তি থামিয়ে দেয়। যদি বেস কেস না থাকে, তবে রিকারশন অবিরত চলতে থাকে এবং এটি স্ট্যাক ওভারফ্লো সৃষ্টি করতে পারে।
- রিকার্সিভ কেস (Recursive Case): এটি সেই অংশ যা ফাংশনটি নিজেকে কল করে এবং সমস্যাটির একটি ছোট অংশ সমাধান করে।
৩. রিকারশন উদাহরণ: ফ্যাক্টোরিয়াল (Factorial) ফাংশন
ফ্যাক্টোরিয়াল একটি সাধারণ গাণিতিক সমস্যা যেখানে একটি সংখ্যার ফ্যাক্টোরিয়াল বের করতে হয়। একটি সংখ্যা n এর ফ্যাক্টোরিয়াল হল n * (n-1) * (n-2) * ... * 1। রিকারশন ব্যবহার করে এটি সমাধান করা যেতে পারে।
উদাহরণ: ফ্যাক্টোরিয়াল ফাংশন (Recursive Factorial Function)
program factorial
integer :: result, number
print *, "Enter a number:"
read *, number
result = factorial(number)
print *, "Factorial of ", number, " is ", result
contains
function factorial(n)
integer :: factorial
integer, intent(in) :: n
if (n <= 1) then
factorial = 1
else
factorial = n * factorial(n-1) ! Recursive call
end if
end function factorial
end program factorialএখানে:
factorialফাংশনটি নিজেকে কল করে, যখনn > 1। যখনn <= 1, তখন এটি বেস কেস হিসাবে ১ ফেরত দেয়।- এই রিকারসিভ ফাংশনটি
nএর ফ্যাক্টোরিয়াল বের করতে কাজ করে।
কাজের প্রক্রিয়া:
- যদি ইনপুট
5হয়, তখনfactorial(5)হবে5 * factorial(4)। - এরপর
factorial(4)হবে4 * factorial(3)। - এভাবে চলে যাবে, এবং শেষে
factorial(1)১ ফেরত দেবে, যা বেস কেস।
৪. রিকারসিভ প্রসিডিউর (Recursive Procedure)
ফোরট্রানে ফাংশনের পাশাপাশি প্রসিডিউরেও রিকারশন ব্যবহার করা যায়। রিকারসিভ প্রসিডিউর সাধারণত একটি নির্দিষ্ট কাজ সম্পাদন করতে থাকে এবং সেই কাজটি অন্য একটি পুনরাবৃত্তি করতে পারে।
উদাহরণ: ফিবোনাচ্চি সিরিজ (Recursive Fibonacci Sequence)
ফিবোনাচ্চি সিরিজে প্রতিটি সংখ্যা পূর্ববর্তী দুইটি সংখ্যার যোগফল হয়। অর্থাৎ, F(n) = F(n-1) + F(n-2)।
program fibonacci
integer :: n, result
print *, "Enter a number:"
read *, n
result = fibonacci(n)
print *, "Fibonacci of ", n, " is ", result
contains
function fibonacci(n)
integer :: fibonacci
integer, intent(in) :: n
if (n == 0) then
fibonacci = 0
elseif (n == 1) then
fibonacci = 1
else
fibonacci = fibonacci(n-1) + fibonacci(n-2) ! Recursive call
end if
end function fibonacci
end program fibonacciএখানে:
fibonacci(n)ফাংশনটি নিজেইn-1এবংn-2এর ফিবোনাচ্চি মান ফিরিয়ে আনার জন্য নিজেকে কল করে।
কাজের প্রক্রিয়া:
fibonacci(5)হবেfibonacci(4) + fibonacci(3)।- এটি আরো ছোট আকারে কল হতে থাকে, এবং অবশেষে
fibonacci(1)এবংfibonacci(0)১ এবং ০ ফেরত দেয়, যা বেস কেস।
৫. রিকারশন এবং মেমরি ব্যবস্থাপনা
- রিকারশন ব্যবহারের সময় ফাংশন বা প্রসিডিউরের প্রতিটি কল স্ট্যাকের মধ্যে মেমরি বরাদ্দ করে, যার ফলে কিছু সীমাবদ্ধতা থাকতে পারে। যখন খুব গভীর রিকারশন হয় (যেমন ইনপুট সংখ্যা বড় হলে), এটি স্ট্যাক ওভারফ্লো বা মেমরি সমস্যার সৃষ্টি করতে পারে।
- তাই, খুব গভীর রিকারশন ব্যবহার করা এড়ানো উচিত, বা পিটিএম (tail recursion) ব্যবহার করা উচিত যেখানে রিকারশনটি ফাংশনের শেষ লাইন হিসাবে থাকে, এবং প্রয়োজনীয় মেমরি কম ব্যবহৃত হয়।
উপসংহার
ফোরট্রানে রিকারশন একটি শক্তিশালী কৌশল যা পুনরাবৃত্তিক সমস্যা সমাধান করতে সহায়ক। রিকার্সিভ ফাংশন বা প্রসিডিউর একটি সমস্যা ছোট অংশে ভেঙে সমাধান করতে সক্ষম, কিন্তু এটি ব্যবহার করার সময় বেস কেস সঠিকভাবে নির্ধারণ করা গুরুত্বপূর্ণ যাতে অবিরাম রিকারশন থেকে এড়ানো যায়।
Read more