Procedures এবং Functions (প্রোসিডিউর এবং ফাংশনস)

ফোরট্রান (Fortran) - Computer Programming

298

প্রোসিডিউর এবং ফাংশনস (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_operations

math_operations মডিউলে square ফাংশন এবং print_square সাবরুটিন রয়েছে।

মডিউল ব্যবহার

program main
    use math_operations
    real :: result
    result = square(4.0)
    call print_square(result)
end program main

উপসংহার

ফোরট্রানে প্রোসিডিউর এবং ফাংশন ব্যবহার করে প্রোগ্রামিং আরো সহজ এবং মডুলার করা যায়। ফাংশনগুলি মান ফেরত দিতে ব্যবহৃত হয়, যখন সাবরুটিনগুলি নির্দিষ্ট কার্যক্রম সম্পাদন করে। মডিউল ব্যবহার করে প্রোসিডিউর এবং ফাংশনগুলোকে সহজে পুনঃব্যবহারযোগ্য করা যায়।

Content added By

ফোরট্রানে 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 এর মধ্যে পার্থক্য:

বৈশিষ্ট্যSubroutineFunction
ফলাফলকোনো মান ফেরত দেয় না। এটি শুধুমাত্র কাজ সম্পাদন করে।একটি মান (ভ্যালু) ফেরত দেয়।
RETURN স্টেটমেন্টRETURN স্টেটমেন্ট ব্যবহার করা হয়, তবে কোনো মান ফেরত না দিয়ে সাবরুটিন থেকে বের হয়।ফাংশনে ফেরত দেওয়া মান অবশ্যই FUNCTION_NAME = value এর মাধ্যমে ফেরত দিতে হয়।
কলিং সেগমেন্টসাবরুটিন কল করার জন্য CALL স্টেটমেন্ট ব্যবহার করা হয়।ফাংশন কল করার জন্য সরাসরি নাম ব্যবহার করা হয় (যেমন, result = function_name(...))।
প্রকৃতিসাধারণত একাধিক আর্গুমেন্ট গ্রহণ করে এবং তাদের মান পরিবর্তন করে।সাধারণত একক আর্গুমেন্ট নিয়ে একটি নির্দিষ্ট কাজ করে এবং একটি মান ফেরত দেয়।
ভ্যালু রিটার্নকোনো মান ফেরত দেয় না, তবে আর্গুমেন্টের মান পরিবর্তন করতে পারে।একটি মান ফেরত দেয়।

উপসংহার

  • Subroutine ব্যবহার করা হয় যখন আপনি কোনো কাজ সম্পাদন করতে চান এবং কোনো মান ফেরত না দিয়ে আর্গুমেন্টগুলির মান পরিবর্তন করতে চান।
  • Function ব্যবহার করা হয় যখন একটি নির্দিষ্ট কাজ সম্পাদন করে একটি মান ফেরত দিতে হবে, যেমন গাণিতিক গণনা বা বিশ্লেষণ।

ফোরট্রানে যখনই কোনো প্রোগ্রাম লিখবেন, তখন আপনাকে বুঝে নিতে হবে কোন অবস্থায় সাবরুটিন বা ফাংশন ব্যবহার করবেন।

Content added By

ফোরট্রানে 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-এর মধ্যে কোডের পুনঃব্যবহারযোগ্য অংশ তৈরি করা যায়, যা একই কাজ বারবার করতে ব্যবহৃত হয়।

৩. ফাংশন এবং সাবরুটিনের মধ্যে পার্থক্য

বৈশিষ্ট্যFunctionSubroutine
রিটার্ন মানএকটি একক মান রিটার্ন করেকোনো মান রিটার্ন করে না
কল পদ্ধতিফাংশন কল করার মাধ্যমে ব্যবহৃত হয়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 সরাসরি কার্যক্রম সম্পাদন করে এবং কোনো মান রিটার্ন করে না। এই দুটি কৌশল আপনাকে আরও মডুলার এবং কার্যকর প্রোগ্রাম তৈরি করতে সাহায্য করবে।

Content added By

ফোরট্রানে Modules এবং Procedures এর ব্যবহার

ফোরট্রানে Modules এবং Procedures ব্যবহারের মাধ্যমে কোডের মডুলারিটি এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করা হয়। Modules এবং Procedures কোডের কার্যকারিতা আরও সংগঠিত এবং পরিষ্কার করে তোলে, যা বড় প্রজেক্টের ক্ষেত্রে অত্যন্ত উপকারী।


১. Modules (মডিউলস)

ফোরট্রানে Modules একটি কোডের অংশ যা প্রোগ্রামের অন্যান্য অংশে পুনঃব্যবহারযোগ্য কম্পোনেন্ট হিসেবে কাজ করে। Modules ব্যবহারের মাধ্যমে আপনি একটি নির্দিষ্ট ফাংশন, সাবরুটিন, বা ডেটা সেগমেন্ট একাধিক প্রোগ্রামে শেয়ার করতে পারেন।

Modules এর সুবিধা:

  • কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
  • কোডের মডুলারিটি বৃদ্ধি পায়।
  • বড় প্রোগ্রামের কোড উন্নত এবং কার্যকরী হয়।

মডিউল ব্যবহার করার সাধারণ পদ্ধতি:

  1. Module তৈরি করা।
  2. Module এর ভেরিয়েবল, ফাংশন বা সাবরুটিন ডিফাইন করা।
  3. প্রোগ্রাম বা অন্য মডিউলে 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.0

b. 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 ডেটা ও কার্যাবলী একত্রে প্যাকেজ করে কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।

Content added By

রিকারশন এবং রিকার্সিভ প্রসিডিউরস (Recursion and Recursive Procedures in Fortran)

রিকারশন (Recursion) হলো একটি প্রোগ্রামিং কৌশল যেখানে একটি ফাংশন বা প্রসিডিউর নিজেই নিজেকে কল করে। এটি বিশেষভাবে উপকারী যখন সমস্যার সমাধানটি ছোট উপসমস্যায় বিভক্ত করা যায় এবং উপসমস্যাগুলির সমাধান একে অপরের সাথে সম্পর্কিত থাকে। ফোরট্রান-এ রিকারশন ব্যবহার করা হয় সাধারণত গণনা সম্পর্কিত বা সমস্যাগুলি পুনরাবৃত্তির মাধ্যমে সমাধান করতে।

১. রিকারশন কী এবং এটি কিভাবে কাজ করে?

রিকারশন হল একটি প্রক্রিয়া যেখানে একটি ফাংশন বা প্রসিডিউর নিজেই নিজেকে কল করে। একটি রিকার্সিভ ফাংশন সাধারণত একটি "বেস কেস" থাকে, যা প্রোগ্রামটির পুনরাবৃত্তি থামানোর শর্ত নির্ধারণ করে। বেস কেস ছাড়া, এটি নিজেই নিজেকে পুনরায় কল করে সমস্যাটির smaller version সমাধান করে।

২. রিকার্সিভ ফাংশন (Recursive Function)

রিকারসিভ ফাংশন বা প্রসিডিউর সাধারণত দুটি অংশ নিয়ে গঠিত:

  1. বেস কেস (Base Case): এটি সেই শর্ত যা রিকার্সনের পুনরাবৃত্তি থামিয়ে দেয়। যদি বেস কেস না থাকে, তবে রিকারশন অবিরত চলতে থাকে এবং এটি স্ট্যাক ওভারফ্লো সৃষ্টি করতে পারে।
  2. রিকার্সিভ কেস (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 এর ফ্যাক্টোরিয়াল বের করতে কাজ করে।

কাজের প্রক্রিয়া:

  1. যদি ইনপুট 5 হয়, তখন factorial(5) হবে 5 * factorial(4)
  2. এরপর factorial(4) হবে 4 * factorial(3)
  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 এর ফিবোনাচ্চি মান ফিরিয়ে আনার জন্য নিজেকে কল করে।

কাজের প্রক্রিয়া:

  1. fibonacci(5) হবে fibonacci(4) + fibonacci(3)
  2. এটি আরো ছোট আকারে কল হতে থাকে, এবং অবশেষে fibonacci(1) এবং fibonacci(0) ১ এবং ০ ফেরত দেয়, যা বেস কেস।

৫. রিকারশন এবং মেমরি ব্যবস্থাপনা

  • রিকারশন ব্যবহারের সময় ফাংশন বা প্রসিডিউরের প্রতিটি কল স্ট্যাকের মধ্যে মেমরি বরাদ্দ করে, যার ফলে কিছু সীমাবদ্ধতা থাকতে পারে। যখন খুব গভীর রিকারশন হয় (যেমন ইনপুট সংখ্যা বড় হলে), এটি স্ট্যাক ওভারফ্লো বা মেমরি সমস্যার সৃষ্টি করতে পারে।
  • তাই, খুব গভীর রিকারশন ব্যবহার করা এড়ানো উচিত, বা পিটিএম (tail recursion) ব্যবহার করা উচিত যেখানে রিকারশনটি ফাংশনের শেষ লাইন হিসাবে থাকে, এবং প্রয়োজনীয় মেমরি কম ব্যবহৃত হয়।

উপসংহার

ফোরট্রানে রিকারশন একটি শক্তিশালী কৌশল যা পুনরাবৃত্তিক সমস্যা সমাধান করতে সহায়ক। রিকার্সিভ ফাংশন বা প্রসিডিউর একটি সমস্যা ছোট অংশে ভেঙে সমাধান করতে সক্ষম, কিন্তু এটি ব্যবহার করার সময় বেস কেস সঠিকভাবে নির্ধারণ করা গুরুত্বপূর্ণ যাতে অবিরাম রিকারশন থেকে এড়ানো যায়।

Content added By
Promotion

Are you sure to start over?

Loading...