প্রোসিডিউর এবং ফাংশনস (Procedures and Functions in Fortran)
ফোরট্রানে প্রোসিডিউর এবং ফাংশনস ব্যবহার করে কোডকে পুনঃব্যবহারযোগ্য ও মডুলার করা যায়। প্রোসিডিউর এবং ফাংশন দুটি আলাদা হলেও, উভয়েই নির্দিষ্ট কাজ সম্পাদন করার জন্য ব্যবহৃত হয়।
১. ফাংশনস (Functions)
ফাংশন একটি প্রোসিডিউর যা কোনো মান গ্রহণ করে এবং একটি নির্দিষ্ট মান ফেরত দেয়। ফোরট্রানে ফাংশন ব্যবহার করে গাণিতিক গণনা বা নির্দিষ্ট মানের গণনা সহজে করা যায়।
ফাংশন ডিক্লারেশন
type function function_name(arguments)
! declarations
function_name = result
end function function_nameউদাহরণ:
real function square(x)
real, intent(in) :: x
square = x * x
end function squareএখানে square ফাংশনটি x এর বর্গফল গণনা করে এবং ফেরত দেয়।
ফাংশন কল করা
real :: result
result = square(5.0) ! result হবে 25.0২. সাবরুটিন (Subroutine)
সাবরুটিন একটি প্রোসিডিউর যা একাধিক কার্যক্রম সম্পাদন করতে পারে, কিন্তু ফাংশনের মতো কোনো মান ফেরত দেয় না। এটি মূলত কোনো কাজ সম্পাদন করার জন্য ব্যবহৃত হয়।
সাবরুটিন ডিক্লারেশন
subroutine subroutine_name(arguments)
! declarations
! statements
end subroutine subroutine_nameউদাহরণ:
subroutine print_square(x)
real, intent(in) :: x
print *, "Square of", x, "is", x * x
end subroutine print_squareএখানে, print_square সাবরুটিনটি কোনো মান ফেরত দেয় না বরং x এর বর্গফল প্রিন্ট করে।
সাবরুটিন কল করা
call print_square(5.0) ! আউটপুট হবে: Square of 5.0 is 25.0ফাংশন এবং সাবরুটিনের মধ্যে পার্থক্য
| বৈশিষ্ট্য | ফাংশন (Function) | সাবরুটিন (Subroutine) |
|---|---|---|
| ফেরত মান | হ্যাঁ, একটি নির্দিষ্ট মান ফেরত দেয় | না, কোনো মান ফেরত দেয় না |
| কল করার ধরণ | সরাসরি মানের মধ্যে অ্যাসাইন করে কল করা যায় | call কিওয়ার্ড ব্যবহার করে কল করা হয় |
| ব্যবহার | সাধারণত গণনা এবং মান নির্ধারণে ব্যবহৃত | সাধারণত কার্য পরিচালনার জন্য ব্যবহৃত |
৩. আর্গুমেন্টস এবং প্যারামিটারস
ফোরট্রানে প্রোসিডিউর এবং ফাংশন-এ আর্গুমেন্ট হিসেবে ইনপুট বা আউটপুট ডেটা পাস করা যায়। আর্গুমেন্টের ধরন নির্ধারণ করতে intent(in), intent(out), এবং intent(inout) ব্যবহার করা হয়।
উদাহরণ:
subroutine add(a, b, result)
integer, intent(in) :: a, b
integer, intent(out) :: result
result = a + b
end subroutine addএখানে add সাবরুটিনটি a এবং b গ্রহণ করে এবং তাদের যোগফল result এ প্রদান করে।
৪. মডিউলস (Modules)
ফোরট্রানে প্রোসিডিউর এবং ফাংশনগুলোকে মডিউল ব্যবহার করে সংগঠিত করা যায়, যা কোড পুনঃব্যবহারযোগ্য করে তোলে।
উদাহরণ:
module math_operations
contains
real function square(x)
real, intent(in) :: x
square = x * x
end function square
subroutine print_square(x)
real, intent(in) :: x
print *, "Square of", x, "is", x * x
end subroutine print_square
end module math_operationsmath_operations মডিউলে square ফাংশন এবং print_square সাবরুটিন রয়েছে।
মডিউল ব্যবহার
program main
use math_operations
real :: result
result = square(4.0)
call print_square(result)
end program mainউপসংহার
ফোরট্রানে প্রোসিডিউর এবং ফাংশন ব্যবহার করে প্রোগ্রামিং আরো সহজ এবং মডুলার করা যায়। ফাংশনগুলি মান ফেরত দিতে ব্যবহৃত হয়, যখন সাবরুটিনগুলি নির্দিষ্ট কার্যক্রম সম্পাদন করে। মডিউল ব্যবহার করে প্রোসিডিউর এবং ফাংশনগুলোকে সহজে পুনঃব্যবহারযোগ্য করা যায়।
ফোরট্রানে Subroutine এবং Function এর মধ্যে পার্থক্য
ফোরট্রানে Subroutine এবং Function উভয়ই কোড পুনঃব্যবহারযোগ্য করতে ব্যবহৃত হয়, তবে এদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। এগুলির কাজ একই রকম হলেও তাদের ব্যবহার এবং স্ট্রাকচার ভিন্ন।
১. Subroutine (সাবরুটিন)
Subroutine হলো একটি ব্লক কোড যা এক বা একাধিক আর্গুমেন্ট (পারামিটার) গ্রহণ করে এবং নির্দিষ্ট কাজ সম্পাদন করে। সাবরুটিন কোনো মান ফেরত দেয় না, তবে এটি আর্গুমেন্টের মান পরিবর্তন করতে পারে এবং অন্যান্য পরিবর্তন করতে পারে।
সিনট্যাক্স:
SUBROUTINE <subroutine_name>(<arguments>)
! কোড
END SUBROUTINE <subroutine_name>উদাহরণ:
PROGRAM example_subroutine
INTEGER :: a, b
a = 5
b = 10
CALL add_numbers(a, b)
PRINT *, 'a = ', a
PRINT *, 'b = ', b
CONTAINS
SUBROUTINE add_numbers(x, y)
INTEGER :: x, y
x = x + 1
y = y + 2
END SUBROUTINE add_numbers
END PROGRAM example_subroutineএখানে add_numbers সাবরুটিন a এবং b কে পরিবর্তন করবে, তবে এটি কোনো মান ফেরত দেয় না।
২. Function (ফাংশন)
Function হলো একটি বিশেষ ধরনের সাবরুটিন যা একটি মান ফেরত দেয়। এটি একটি নির্দিষ্ট কাজ সম্পাদন করে এবং একটি মান ফিরিয়ে দেয়। ফাংশন সাধারণত গণনা বা বিশ্লেষণ সংক্রান্ত কাজের জন্য ব্যবহৃত হয়।
সিনট্যাক্স:
FUNCTION <function_name>(<arguments>)
! কোড
<function_name> = <return_value>
END FUNCTION <function_name>উদাহরণ:
PROGRAM example_function
REAL :: result
result = square(5.0)
PRINT *, 'The square of 5.0 is: ', result
CONTAINS
FUNCTION square(x)
REAL :: square, x
square = x * x
END FUNCTION square
END PROGRAM example_functionএখানে square ফাংশন একটি রিয়েল মান হিসেবে ফলাফল ফেরত দেয়, যা result ভেরিয়েবলে সংরক্ষিত হয়।
Subroutine এবং Function এর মধ্যে পার্থক্য:
| বৈশিষ্ট্য | Subroutine | Function |
|---|---|---|
| ফলাফল | কোনো মান ফেরত দেয় না। এটি শুধুমাত্র কাজ সম্পাদন করে। | একটি মান (ভ্যালু) ফেরত দেয়। |
| RETURN স্টেটমেন্ট | RETURN স্টেটমেন্ট ব্যবহার করা হয়, তবে কোনো মান ফেরত না দিয়ে সাবরুটিন থেকে বের হয়। | ফাংশনে ফেরত দেওয়া মান অবশ্যই FUNCTION_NAME = value এর মাধ্যমে ফেরত দিতে হয়। |
| কলিং সেগমেন্ট | সাবরুটিন কল করার জন্য CALL স্টেটমেন্ট ব্যবহার করা হয়। | ফাংশন কল করার জন্য সরাসরি নাম ব্যবহার করা হয় (যেমন, result = function_name(...))। |
| প্রকৃতি | সাধারণত একাধিক আর্গুমেন্ট গ্রহণ করে এবং তাদের মান পরিবর্তন করে। | সাধারণত একক আর্গুমেন্ট নিয়ে একটি নির্দিষ্ট কাজ করে এবং একটি মান ফেরত দেয়। |
| ভ্যালু রিটার্ন | কোনো মান ফেরত দেয় না, তবে আর্গুমেন্টের মান পরিবর্তন করতে পারে। | একটি মান ফেরত দেয়। |
উপসংহার
- Subroutine ব্যবহার করা হয় যখন আপনি কোনো কাজ সম্পাদন করতে চান এবং কোনো মান ফেরত না দিয়ে আর্গুমেন্টগুলির মান পরিবর্তন করতে চান।
- Function ব্যবহার করা হয় যখন একটি নির্দিষ্ট কাজ সম্পাদন করে একটি মান ফেরত দিতে হবে, যেমন গাণিতিক গণনা বা বিশ্লেষণ।
ফোরট্রানে যখনই কোনো প্রোগ্রাম লিখবেন, তখন আপনাকে বুঝে নিতে হবে কোন অবস্থায় সাবরুটিন বা ফাংশন ব্যবহার করবেন।
ফোরট্রানে Function এবং Subroutine ডিক্লারেশন
ফোরট্রানে Function এবং Subroutine হল কোডের পুনঃব্যবহারযোগ্য ইউনিট, যা প্রোগ্রামটিকে আরও মডুলার এবং পরিচালনা সহজ করে তোলে। Function এবং Subroutine উভয়ই নির্দিষ্ট কাজ সম্পাদন করার জন্য ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে।
১. Function ডিক্লারেশন
ফোরট্রানে Function হল একটি ব্লক কোড যা একটি মান (value) রিটার্ন করে। এটি সাধারণত একটি নির্দিষ্ট গণনা বা লজিক্যাল কাজ করার জন্য ব্যবহৃত হয়, এবং একটি single value রিটার্ন করতে সক্ষম। Function ডিক্লারেশনের সময়, আপনাকে ফাংশনের নাম এবং তার রিটার্ন টাইপ (data type) নির্ধারণ করতে হবে।
Function ডিক্লারেশনের সাধারণ গঠন:
function function_name(arguments)
! function body
end function function_name- function_name: ফাংশনের নাম।
- arguments: ফাংশনটির জন্য ইনপুট আর্গুমেন্ট বা প্যারামিটার।
ফাংশন ডিক্লারেশন উদাহরণ:
program function_example
implicit none
real :: result
real :: a, b
! মান ইনপুট
a = 5.0
b = 10.0
! ফাংশন কল
result = add_numbers(a, b)
print *, "The result is: ", result
contains
! ফাংশন ডিক্লারেশন
function add_numbers(x, y)
real :: add_numbers
real :: x, y
add_numbers = x + y ! ফাংশনটি দুইটি সংখ্যা যোগ করে রিটার্ন করবে
end function add_numbers
end program function_exampleএখানে:
add_numbersহল একটি ফাংশন যা দুইটি real ধরণের আর্গুমেন্ট গ্রহণ করে এবং তাদের যোগফল রিটার্ন করে।- ফাংশনটি
add_numbers = x + yএইভাবে কাজ করে, যেখানে এটিxএবংyযোগ করে তার ফলাফল রিটার্ন করে।
ফাংশনের বৈশিষ্ট্য:
- ফাংশনটি সাধারণত একটি একক মান রিটার্ন করে।
- ফাংশন কলের মাধ্যমে এর রিটার্ন মান কোডে ব্যবহার করা যায়।
- ফাংশন ডিক্লারেশন এর মাধ্যমে ইনপুট প্যারামিটার এবং রিটার্ন টাইপের মধ্যে সম্পর্ক স্থাপন করা হয়।
২. Subroutine ডিক্লারেশন
ফোরট্রানে Subroutine একটি কোড ব্লক যা কোনো মান রিটার্ন করে না, বরং এটি সরাসরি কার্যকরী কোড চালায়। Subroutine সাধারণত একাধিক আর্গুমেন্ট গ্রহণ করতে পারে এবং কোডের পুনঃব্যবহারযোগ্য অংশ হিসেবে ব্যবহৃত হয়।
Subroutine ডিক্লারেশনের সাধারণ গঠন:
subroutine subroutine_name(arguments)
! subroutine body
end subroutine subroutine_name- subroutine_name: সাবরুটিনের নাম।
- arguments: সাবরুটিনের ইনপুট প্যারামিটার (ঐচ্ছিক)।
সাবরুটিন ডিক্লারেশন উদাহরণ:
program subroutine_example
implicit none
real :: a, b
! মান ইনপুট
a = 5.0
b = 10.0
! সাবরুটিন কল
call add_numbers(a, b)
contains
! সাবরুটিন ডিক্লারেশন
subroutine add_numbers(x, y)
real :: x, y
print *, "The sum of ", x, " and ", y, " is: ", x + y
end subroutine add_numbers
end program subroutine_exampleএখানে:
add_numbersহল একটি সাবরুটিন যা দুটি আর্গুমেন্ট নেয় এবং তাদের যোগফল স্ক্রীনে প্রিন্ট করে।callকিওয়ার্ডটি সাবরুটিনটি কল করার জন্য ব্যবহৃত হয়।- সাবরুটিন কোনো মান রিটার্ন করে না, এটি সরাসরি কার্যক্রম সম্পাদন করে।
সাবরুটিনের বৈশিষ্ট্য:
- সাবরুটিন কোনো মান রিটার্ন করে না, তবে এটি ইনপুট আর্গুমেন্ট পরিবর্তন করতে পারে (যদি তা
intent(inout)বাintent(out)হিসেবে ডিক্লেয়ার করা থাকে)। - Subroutine-এর মধ্যে কোডের পুনঃব্যবহারযোগ্য অংশ তৈরি করা যায়, যা একই কাজ বারবার করতে ব্যবহৃত হয়।
৩. ফাংশন এবং সাবরুটিনের মধ্যে পার্থক্য
| বৈশিষ্ট্য | Function | Subroutine |
|---|---|---|
| রিটার্ন মান | একটি একক মান রিটার্ন করে | কোনো মান রিটার্ন করে না |
| কল পদ্ধতি | ফাংশন কল করার মাধ্যমে ব্যবহৃত হয় | call কিওয়ার্ড ব্যবহার করে কল করা হয় |
| ইনপুট প্যারামিটার | শুধুমাত্র আর্গুমেন্ট গ্রহণ করে | আর্গুমেন্ট গ্রহণ করতে পারে, তবে এটি মান রিটার্ন করে না |
| ব্যবহার | গাণিতিক বা লজিক্যাল ফলাফল রিটার্ন করতে ব্যবহৃত | কোডের কার্যক্রম সম্পাদন করতে ব্যবহৃত |
৪. ইনপুট প্যারামিটার এবং আর্গুমেন্ট ম্যানিপুলেশন
ফোরট্রানে intent কিওয়ার্ড ব্যবহার করে আপনি একটি প্যারামিটারের উদ্দেশ্য নির্ধারণ করতে পারেন, যেমন intent(in), intent(out), অথবা intent(inout)।
উদাহরণ:
program argument_example
implicit none
real :: a, b
a = 5.0
b = 10.0
call multiply(a, b)
print *, 'The value of a after subroutine call: ', a
print *, 'The value of b after subroutine call: ', b
contains
subroutine multiply(x, y)
real :: x, y
! x কে পরিবর্তন না করে y এর মান গুণ করা
x = x * y
y = y * 2
end subroutine multiply
end program argument_exampleএখানে:
x = x * y:xএর মান পরিবর্তন করা হয়েছে।y = y * 2:yএর মান পরিবর্তন করা হয়েছে।
এটি দেখায় যে intent(inout) বা intent(out) প্যারামিটারগুলির মাধ্যমে ইনপুট এবং আউটপুট প্যারামিটার ম্যানিপুলেশন সম্ভব।
উপসংহার
ফোরট্রানে Function এবং Subroutine উভয়ই কোডের পুনঃব্যবহারযোগ্য অংশ তৈরি করতে ব্যবহৃত হয়, তবে তাদের মধ্যে মৌলিক পার্থক্য রয়েছে। Function একটি একক মান রিটার্ন করে, যেখানে Subroutine সরাসরি কার্যক্রম সম্পাদন করে এবং কোনো মান রিটার্ন করে না। এই দুটি কৌশল আপনাকে আরও মডুলার এবং কার্যকর প্রোগ্রাম তৈরি করতে সাহায্য করবে।
ফোরট্রানে Modules এবং Procedures এর ব্যবহার
ফোরট্রানে Modules এবং Procedures ব্যবহারের মাধ্যমে কোডের মডুলারিটি এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করা হয়। Modules এবং Procedures কোডের কার্যকারিতা আরও সংগঠিত এবং পরিষ্কার করে তোলে, যা বড় প্রজেক্টের ক্ষেত্রে অত্যন্ত উপকারী।
১. Modules (মডিউলস)
ফোরট্রানে Modules একটি কোডের অংশ যা প্রোগ্রামের অন্যান্য অংশে পুনঃব্যবহারযোগ্য কম্পোনেন্ট হিসেবে কাজ করে। Modules ব্যবহারের মাধ্যমে আপনি একটি নির্দিষ্ট ফাংশন, সাবরুটিন, বা ডেটা সেগমেন্ট একাধিক প্রোগ্রামে শেয়ার করতে পারেন।
Modules এর সুবিধা:
- কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
- কোডের মডুলারিটি বৃদ্ধি পায়।
- বড় প্রোগ্রামের কোড উন্নত এবং কার্যকরী হয়।
মডিউল ব্যবহার করার সাধারণ পদ্ধতি:
- Module তৈরি করা।
- Module এর ভেরিয়েবল, ফাংশন বা সাবরুটিন ডিফাইন করা।
- প্রোগ্রাম বা অন্য মডিউলে Module অন্তর্ভুক্ত করা।
উদাহরণ: মডিউল এবং সাবরুটিনের ব্যবহার
module math_operations
implicit none
contains
! একটি সাবরুটিন যা দুটি সংখ্যার যোগফল করবে
subroutine add_numbers(a, b, result)
real, intent(in) :: a, b
real, intent(out) :: result
result = a + b
end subroutine add_numbers
end module math_operations
program main
use math_operations ! মডিউল ব্যবহার করা
real :: num1, num2, sum
! ইনপুট প্রদান
num1 = 5.0
num2 = 3.0
! মডিউল সাবরুটিন ব্যবহার করা
call add_numbers(num1, num2, sum)
print *, 'Sum = ', sum
end program mainব্যাখ্যা:
math_operationsনামক মডিউল তৈরি করা হয়েছে, যার মধ্যে একটি সাবরুটিন add_numbers রয়েছে যা দুটি রিয়েল নাম্বারের যোগফল বের করে।mainপ্রোগ্রামে এই মডিউলটিuseকিওয়ার্ড দিয়ে অন্তর্ভুক্ত করা হয়েছে এবং সাবরুটিন add_numbers ব্যবহৃত হয়েছে।
আউটপুট:
Sum = 8.0২. Procedures (প্রসিডিউরস)
ফোরট্রানে Procedures হল subroutines এবং functions। এগুলো কোডের নির্দিষ্ট অংশের কার্যক্রম সম্পাদন করে এবং এগুলিকে প্রোগ্রামের অন্য অংশে ব্যবহার করা যায়। Procedures (সাবরুটিন এবং ফাংশন) ফোরট্রানে কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে এবং কোডের অভ্যন্তরীণ কার্যাবলী সম্পাদন করে।
a. Subroutines (সাবরুটিন)
Subroutine হল একটি ব্লক কোড যা নির্দিষ্ট কাজ সম্পাদন করে এবং কোন মান ফিরিয়ে দেয় না (এটি সাধারণত output বা side-effects জন্য ব্যবহৃত হয়)। সাবরুটিনের মধ্যে ইনপুট (input) আর্গুমেন্ট থাকতে পারে এবং এটি পরিবর্তন করতে পারে (output আর্গুমেন্ট)।
উদাহরণ: সাবরুটিন ব্যবহার
program subroutine_example
real :: a, b, result
! ইনপুট প্রদান
a = 5.0
b = 3.0
! সাবরুটিন কল করা
call multiply(a, b, result)
print *, 'Product = ', result
contains
subroutine multiply(x, y, res)
real, intent(in) :: x, y
real, intent(out) :: res
res = x * y ! x এবং y এর গুণফল বের করা
end subroutine multiply
end program subroutine_exampleব্যাখ্যা:
- সাবরুটিন multiply দুটি সংখ্যার গুণফল বের করে এবং প্রোগ্রামের মূল অংশে ফলাফল দেখানো হয়।
আউটপুট:
Product = 15.0b. Functions (ফাংশন)
Function একটি সাবরুটিনের মতো, তবে এটি একটি মান ফেরত দেয়। ফাংশনকে সাধারণত এক্সপ্রেশন বা গণনার মধ্যে ব্যবহার করা হয়।
উদাহরণ: ফাংশন ব্যবহার
program function_example
real :: a, b, result
! ইনপুট প্রদান
a = 10.0
b = 5.0
! ফাংশন কল করা
result = divide(a, b)
print *, 'Division result = ', result
contains
function divide(x, y)
real, intent(in) :: x, y
real :: divide
divide = x / y ! x এবং y এর ভাগফল
end function divide
end program function_exampleব্যাখ্যা:
- ফাংশন divide দুটি সংখ্যার ভাগফল প্রদান করে এবং প্রোগ্রামে সেই ফলাফল ব্যবহার করা হয়।
আউটপুট:
Division result = 2.000000৩. Modules এবং Procedures এর সুবিধা
- Modularity: Modules এবং Procedures কোডকে ছোট ছোট অংশে ভাগ করে, যা ডেভেলপারদের জন্য কোড বুঝতে এবং রক্ষণাবেক্ষণ করতে সহজ করে।
- Reusability: একবার লিখিত Subroutines বা Functions পুনরায় ব্যবহার করা যায়, যেগুলি একই ধরনের কাজ অনেকবার করতে ব্যবহৃত হয়।
- Maintainability: কোডের প্রতিটি অংশ পৃথকভাবে পরীক্ষা এবং সংশোধন করা যেতে পারে, যার ফলে বড় প্রজেক্টে রক্ষণাবেক্ষণ সহজ হয়।
- Encapsulation: Modules ডেটা এবং কার্যাবলী একসাথে গুটিয়ে রেখে কোডের সুরক্ষা এবং তথ্য গোপনীয়তা বজায় রাখে।
উপসংহার
ফোরট্রানে Modules এবং Procedures ব্যবহার করার মাধ্যমে কোড মডুলার এবং পুনঃব্যবহারযোগ্য করা সম্ভব, যা বড় প্রোগ্রামগুলির রক্ষণাবেক্ষণ এবং পরিচালনা সহজ করে তোলে। Subroutines এবং Functions ফাংশনালিটির মাধ্যমে কোডের কার্যাবলী সম্পাদন করে, এবং Modules ডেটা ও কার্যাবলী একত্রে প্যাকেজ করে কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
রিকারশন এবং রিকার্সিভ প্রসিডিউরস (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