Rexx প্রোগ্রামিং ভাষায় ফাংশন (Functions) এবং সাবরুটিন (Subroutines) কোডের পুনঃব্যবহারযোগ্যতা এবং সংগঠিত কাঠামো তৈরির জন্য ব্যবহৃত হয়। এগুলি প্রোগ্রামকে আরও কার্যকরী এবং পাঠযোগ্য করে তোলে।
১. ফাংশন (Functions):
Rexx-এ ফাংশন সাধারণত একাধিক মান গ্রহণ করে এবং একটি মান ফেরত দেয়। ফাংশনগুলি নির্দিষ্ট কাজ সম্পাদন করে এবং তাদের ব্যবহারের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা বাড়ানো যায়।
ফাংশন ডিফাইন করা:
ফাংশনটি parse কমান্ড দিয়ে আর্গুমেন্ট গ্রহণ করে এবং return স্টেটমেন্ট দিয়ে ফলাফল প্রদান করে।
/* ফাংশন ডিফাইন করা */
multiply: procedure
parse arg a b /* আর্গুমেন্ট গ্রহণ */
return a * b /* গুণফল ফেরত দেয় */এখানে multiply একটি ফাংশন যা দুইটি আর্গুমেন্ট নেয় এবং তাদের গুণফল ফেরত দেয়।
ফাংশন কল করা:
ফাংশন কল করতে call ব্যবহার করা হয়। নিচে উদাহরণ দেওয়া হলো:
/* ফাংশন কল করা */
result = multiply(3, 5) /* আর্গুমেন্ট ৩ এবং ৫ পাস করা হচ্ছে */
say "Multiplication Result: " result /* আউটপুট: 15 */এখানে multiply(3, 5) ফাংশনটি কল করা হয়েছে এবং আউটপুট 15 প্রদর্শিত হবে।
২. সাবরুটিন (Subroutines):
সাবরুটিন এমন একটি প্রোগ্রাম ব্লক যা কোন ফলাফল না দিয়ে একটি নির্দিষ্ট কাজ সম্পাদন করে। এটি সাধারণত কিছু কাজ করার জন্য ব্যবহৃত হয়, যেমন আউটপুট প্রদর্শন বা কিছু পরিবর্তন করা। সাবরুটিনে আর্গুমেন্ট পাস করা যেতে পারে, তবে এটি সাধারণত return স্টেটমেন্ট ছাড়াই কাজ করে।
সাবরুটিন ডিফাইন করা:
/* সাবরুটিন ডিফাইন করা */
mySubroutine:
say "This is a subroutine!"
returnএখানে mySubroutine একটি সাবরুটিন, যা শুধুমাত্র একটি বার্তা প্রদর্শন করে।
সাবরুটিন কল করা:
সাবরুটিনকে call স্টেটমেন্ট ব্যবহার করে কল করা হয়।
/* সাবরুটিন কল করা */
call mySubroutine /* সাবরুটিনটি কল করা হয়েছে */এখানে call mySubroutine ব্যবহার করে সাবরুটিনটি কল করা হয়েছে, এবং এটি স্ক্রীনে "This is a subroutine!" বার্তা প্রদর্শন করবে।
৩. আর্গুমেন্ট পাস (Passing Arguments):
Rexx তে ফাংশন এবং সাবরুটিনে আর্গুমেন্ট পাস করা যায়। এর মাধ্যমে আপনি প্রয়োজনীয় মান ফাংশন বা সাবরুটিনে পাঠাতে পারেন।
ফাংশনে আর্গুমেন্ট পাস করা:
/* ফাংশন যে আর্গুমেন্ট গ্রহণ করে */
add: procedure
parse arg x y
return x + yএখানে add ফাংশনটি দুইটি আর্গুমেন্ট x এবং y গ্রহণ করে এবং তাদের যোগফল ফেরত দেয়।
/* ফাংশন কল করা */
result = add(10, 20)
say result /* আউটপুট হবে 30 */সাবরুটিনে আর্গুমেন্ট পাস করা:
/* সাবরুটিনে আর্গুমেন্ট পাস */
printMessage:
parse arg msg
say msgএখানে printMessage সাবরুটিনটি একটি আর্গুমেন্ট গ্রহণ করে এবং সেটি প্রদর্শন করে।
/* সাবরুটিন কল করা */
call printMessage "Hello, Rexx!"এটি "Hello, Rexx!" আউটপুট হিসেবে প্রদর্শন করবে।
৪. ফাংশন এবং সাবরুটিনের মধ্যে পার্থক্য:
- ফাংশন: ফাংশন সাধারণত কিছু মান গ্রহণ করে এবং একটি মান ফেরত দেয়। এটি
returnস্টেটমেন্ট ব্যবহার করে ফলাফল প্রদান করে। - সাবরুটিন: সাবরুটিন কোনো মান ফেরত দেয় না, বরং একটি নির্দিষ্ট কাজ সম্পাদন করে। এটি
returnস্টেটমেন্ট ছাড়া কাজ করে এবং সাধারণত শুধু কার্যকলাপ সম্পাদন করতে ব্যবহৃত হয়।
৫. ফাংশন এবং সাবরুটিনের ব্যবহার:
- ফাংশন ব্যবহার করা হয় যখন আপনি কোনো গাণিতিক কাজ বা প্রক্রিয়া সম্পন্ন করে ফলাফল ফেরত চান, যেমন দুটি সংখ্যার যোগফল বা গুণফল হিসাব করা।
- সাবরুটিন ব্যবহার করা হয় যখন আপনি কোডের কোন নির্দিষ্ট অংশকে আলাদা করে রাখতে চান এবং বারবার সেই কাজটি পুনরায় করতে চান, যেমন আউটপুট প্রদর্শন বা নির্দিষ্ট কিছু কাজ সম্পাদন করা।
সারাংশ:
Rexx-এ ফাংশন এবং সাবরুটিন কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বৃদ্ধি করার জন্য ব্যবহৃত হয়। ফাংশন সাধারণত আর্গুমেন্ট গ্রহণ করে এবং একটি মান ফেরত দেয়, যখন সাবরুটিন কোনো নির্দিষ্ট কাজ সম্পাদন করে এবং সাধারণত কোনো ফলাফল ফেরত দেয় না। Rexx-এর এই সুবিধা গুলি কোড লেখা সহজ করে এবং প্রোগ্রামিং কাজের দক্ষতা বৃদ্ধি করে।
Rexx এ অনেক ধরনের বিল্ট-ইন ফাংশন রয়েছে, যা স্ক্রিপ্ট লেখার সময় ডেভেলপারদের কাজকে সহজ এবং দ্রুত করে তোলে। এই ফাংশনগুলো বিভিন্ন ধরনের ডেটা ম্যানিপুলেশন, ক্যালকুলেশন, টেক্সট প্রসেসিং, সিস্টেম ইন্টারঅ্যাকশন ইত্যাদি কাজ করার জন্য ব্যবহৃত হয়। Rexx এর বিল্ট-ইন ফাংশনগুলো সাধারণত সরাসরি ব্যবহার করা যায়, এবং এগুলোর জন্য কোনো অতিরিক্ত লাইব্রেরি বা প্যাকেজ ইনস্টল করার প্রয়োজন হয় না।
বিল্ট-ইন ফাংশনের গঠন:
Rexx এর বিল্ট-ইন ফাংশনগুলোর সাধারণ গঠন হল:
function_name(argument1, argument2, ...)বিল্ট-ইন ফাংশনের কিছু উদাহরণ এবং ব্যবহার:
১. length() – স্ট্রিং এর দৈর্ঘ্য বের করা
এই ফাংশনটি একটি স্ট্রিং এর দৈর্ঘ্য (characters count) বের করে দেয়।
উদাহরণ:
str = "Hello, Rexx!"
len = length(str)
say "স্ট্রিংটির দৈর্ঘ্য হলো:" lenআউটপুট:
স্ট্রিংটির দৈর্ঘ্য হলো: 13২. substr() – স্ট্রিং থেকে সাবস্ট্রিং বের করা
এই ফাংশনটি একটি স্ট্রিং থেকে নির্দিষ্ট অংশ (substring) বের করতে ব্যবহৃত হয়। এটি স্ট্রিংয়ের নির্দিষ্ট ইনডেক্স থেকে শুরু করে একটি নির্দিষ্ট দৈর্ঘ্য পর্যন্ত সাবস্ট্রিং দেয়।
উদাহরণ:
str = "Rexx Programming"
sub = substr(str, 1, 4)
say "সাবস্ট্রিং হলো:" subআউটপুট:
সাবস্ট্রিং হলো: Rexx৩. upper() – স্ট্রিংকে বড় অক্ষরে রূপান্তর করা
এই ফাংশনটি একটি স্ট্রিংয়ের সব অক্ষরকে বড় (uppercase) অক্ষরে রূপান্তর করে।
উদাহরণ:
str = "hello"
upper_str = upper(str)
say "বড় অক্ষরে রূপান্তরিত স্ট্রিং হলো:" upper_strআউটপুট:
বড় অক্ষরে রূপান্তরিত স্ট্রিং হলো: HELLO৪. lower() – স্ট্রিংকে ছোট অক্ষরে রূপান্তর করা
এই ফাংশনটি একটি স্ট্রিংয়ের সব অক্ষরকে ছোট (lowercase) অক্ষরে রূপান্তর করে।
উদাহরণ:
str = "HELLO"
lower_str = lower(str)
say "ছোট অক্ষরে রূপান্তরিত স্ট্রিং হলো:" lower_strআউটপুট:
ছোট অক্ষরে রূপান্তরিত স্ট্রিং হলো: hello৫. word() – স্ট্রিং থেকে একটি নির্দিষ্ট শব্দ বের করা
এই ফাংশনটি স্ট্রিং থেকে নির্দিষ্ট নম্বরের শব্দ (word) বের করে দেয়।
উদাহরণ:
str = "Rexx is a powerful language"
word_str = word(str, 3)
say "তৃতীয় শব্দ হলো:" word_strআউটপুট:
তৃতীয় শব্দ হলো: a৬. index() – স্ট্রিংয়ে একটি নির্দিষ্ট সাবস্ট্রিংয়ের অবস্থান খুঁজে বের করা
এই ফাংশনটি একটি স্ট্রিংয়ের মধ্যে কোনো সাবস্ট্রিংয়ের অবস্থান (index) খুঁজে বের করে।
উদাহরণ:
str = "Rexx is easy"
pos = index(str, "easy")
say "'easy' শব্দটি স্ট্রিংয়ে অবস্থান করছে ইনডেক্সে:" posআউটপুট:
'easy' শব্দটি স্ট্রিংয়ে অবস্থান করছে ইনডেক্সে: 9৭. strip() – স্ট্রিংয়ের অপ্রয়োজনীয় স্পেস মুছে ফেলা
এই ফাংশনটি একটি স্ট্রিংয়ের শুরু এবং শেষের যে কোনো অতিরিক্ত স্পেস (whitespace) মুছে ফেলে।
উদাহরণ:
str = " Hello, Rexx! "
clean_str = strip(str)
say "স্পেস ছাড়া স্ট্রিং হলো:" clean_strআউটপুট:
স্পেস ছাড়া স্ট্রিং হলো: Hello, Rexx!৮. date() – বর্তমান তারিখ এবং সময় পাওয়া
এই ফাংশনটি সিস্টেমের বর্তমান তারিখ এবং সময় প্রদান করে।
উদাহরণ:
current_date = date()
say "বর্তমান তারিখ এবং সময় হলো:" current_dateআউটপুট:
বর্তমান তারিখ এবং সময় হলো: 2024-11-20 12:30:15৯. round() – দশমিক সংখ্যা রাউন্ড করা
এই ফাংশনটি একটি দশমিক সংখ্যা নির্দিষ্ট সংখ্যা পর্যন্ত রাউন্ড করে দেয়।
উদাহরণ:
num = 15.6789
rounded_num = round(num, 2)
say "রাউন্ড করা সংখ্যা হলো:" rounded_numআউটপুট:
রাউন্ড করা সংখ্যা হলো: 15.68ফাংশন ব্যবহারের সারাংশ:
Rexx এর বিল্ট-ইন ফাংশনগুলি বিভিন্ন কাজে ব্যবহার করা যায়, যেমন টেক্সট প্রসেসিং, ক্যালকুলেশন, ডেটা ফরম্যাটিং, সিস্টেম টাইম ফেচিং ইত্যাদি। এই ফাংশনগুলো স্ক্রিপ্ট লেখার সময় খুবই সাহায্য করে, কারণ এগুলো ডেভেলপারদের জন্য সাধারণ কাজগুলো সহজ করে তোলে। Rexx এ অনেক ধরনের বিল্ট-ইন ফাংশন আছে, যা প্রয়োজনীয় কার্যক্রম দ্রুত এবং কার্যকরভাবে সম্পাদন করতে সক্ষম।
Rexx প্রোগ্রামিং ভাষায় User-defined Functions (UDFs) এবং Subroutines তৈরি করা যায়, যা কোডের পুনঃব্যবহারযোগ্যতা এবং পরিষ্কারতা বৃদ্ধি করে। এই ফাংশন এবং সাবরুটিনগুলি কোডের বিশেষ কার্যাবলী বা টাস্ক সম্পাদন করতে ব্যবহৃত হয়। এটি প্রোগ্রামিংকে আরও সহজ এবং মডুলার করে তোলে। এখানে Rexx-এ User-defined Functions এবং Subroutines তৈরির পদ্ধতি আলোচনা করা হলো।
১. User-defined Functions (UDFs)
Rexx-এ User-defined Functions ব্যবহারকারী দ্বারা তৈরি একটি ফাংশন, যা নির্দিষ্ট কাজ সম্পাদন করে এবং একটি মান ফেরত দেয়। এটি একটি নির্দিষ্ট লজিক বা কার্যাবলী কোডে পুনঃব্যবহার করার জন্য ব্যবহৃত হয়।
ফাংশন তৈরির সিঁথা:
function function_name
/* কোড ব্লক */
return valuefunction_name: এটি আপনার ফাংশনের নাম হবে।return value: ফাংশনটি যখন শেষ হবে, তখন এটি একটি মান (value) ফেরত দিবে।
উদাহরণ:
এখানে একটি User-defined Function তৈরি করা হলো যা দুটি সংখ্যার যোগফল বের করবে:
/* দুটি সংখ্যার যোগফল বের করার ফাংশন */
addNumbers: function(num1, num2)
sum = num1 + num2 /* দুটি সংখ্যার যোগফল */
return sum /* যোগফল ফেরত দিন */
/* ফাংশন কল */
result = addNumbers(5, 7)
say 'ফলাফল:' resultএখানে:
addNumbersএকটি User-defined Function, যা দুটি ইনপুট নেয় এবং তাদের যোগফল ফেরত দেয়।result = addNumbers(5, 7)এই ফাংশনটি কল করে দুটি সংখ্যার যোগফল বের করা হয়েছে।
২. Subroutines
Rexx-এ Subroutine হলো একটি নির্দিষ্ট কোড ব্লক যা কোনো মান ফেরত দেয় না, বরং একটি কাজ সম্পাদন করে। সাবরুটিন সাধারণত একটি নির্দিষ্ট কার্যাবলী সম্পাদন করতে ব্যবহৃত হয় এবং এটি কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
Subroutine তৈরির সিঁথা:
subroutine subroutine_name
/* কোড ব্লক */
returnsubroutine_name: এটি আপনার সাবরুটিনের নাম।- সাবরুটিনে কোনো
returnমান ফেরত না এলেও, এটি কোডের অন্য অংশ থেকে কল করা যেতে পারে।
উদাহরণ:
এখানে একটি Subroutine তৈরি করা হলো যা দুটি সংখ্যার গুণফল বের করবে:
/* দুটি সংখ্যার গুণফল বের করার সাবরুটিন */
multiplyNumbers: procedure(num1, num2)
product = num1 * num2 /* দুটি সংখ্যার গুণফল */
say 'গুণফল:' product /* গুণফল প্রদর্শন */
/* সাবরুটিন কল */
multiplyNumbers(4, 6)এখানে:
multiplyNumbersএকটি Subroutine, যা দুটি সংখ্যার গুণফল বের করে এবং ফলাফল প্রদর্শন করে।multiplyNumbers(4, 6)এই সাবরুটিনটি কল করে দুটি সংখ্যার গুণফল বের করা হয়েছে।
User-defined Functions এবং Subroutines এর মধ্যে পার্থক্য:
| বৈশিষ্ট্য | User-defined Function | Subroutine |
|---|---|---|
| ফেরত মান | হ্যাঁ (Return value) | না (No return value) |
| ব্যবহার | নির্দিষ্ট মান বা ফলাফল ফেরত দেওয়া | কার্যাবলী সম্পাদন করা |
| ব্যবহার ক্ষেত্র | যখন কোন মান ফেরত প্রয়োজন | যখন শুধুমাত্র কাজ সম্পাদন করতে হয় |
| ফাংশন কলের ধরণ | value = function_name() | subroutine_name() |
সারাংশ:
Rexx-এ User-defined Functions (UDFs) এবং Subroutines ব্যবহার করে প্রোগ্রামকে আরও মডুলার এবং পরিষ্কার করা যায়। ফাংশনগুলো সাধারণত মান ফেরত দেয়, আর সাবরুটিনগুলো কাজ সম্পাদন করে, তবে কোনো মান ফেরত দেয় না। উভয়েরই ব্যবহার কোডের পুনঃব্যবহারযোগ্যতা, সহজ রক্ষণাবেক্ষণ এবং কার্যকারিতা নিশ্চিত করতে সহায়তা করে।
Rexx একটি ইন্টারপ্রেটেড ভাষা, এবং এটি ফাংশন ভিত্তিক প্রোগ্রামিং সমর্থন করে। Rexx-এ ফাংশন ডিফাইন করা এবং ফাংশনে প্যারামিটার পাঠানো, এবং রিটার্ন ভ্যালু ব্যবহার করা খুবই সহজ। এখানে আমরা function parameters passing এবং return values সম্পর্কে বিস্তারিত আলোচনা করব।
1. Function Parameters Passing (ফাংশন প্যারামিটার পাস করা)
Rexx-এ ফাংশনে প্যারামিটার পাস করার প্রক্রিয়া সাধারণভাবে প্রোগ্রামিং ভাষার অন্যান্য ভাষার মতোই। আপনি প্যারামিটারগুলোকে ফাংশনে ইনপুট হিসেবে পাঠান এবং সেই প্যারামিটারগুলো ফাংশনের ভিতরে ব্যবহার করতে পারেন।
ফাংশন ডিফাইনেশন এবং প্যারামিটার পাস করা:
Rexx-এ ফাংশন ডিফাইন করতে parse স্টেটমেন্ট বা আর্গুমেন্ট প্যারামিটার হিসেবে সরাসরি ভ্যালু পাস করা হয়।
/* ফাংশন ডিফাইন করা */
greet: procedure
parse arg name /* 'name' প্যারামিটার গ্রহণ করা */
say "Hello, " name
returnএই ফাংশনটি greet নামে একটি প্রক্রিয়া তৈরি করে যা একটি প্যারামিটার name নেয় এবং তার মান ব্যবহার করে একটি সালাম (greeting) মেসেজ প্রদর্শন করে।
ফাংশন কল এবং প্যারামিটার পাস করা:
ফাংশনে প্যারামিটার পাস করার সময়, আপনি সরাসরি মান পাঠাতে পারেন। যেমন:
greet "Rexx" /* 'Rexx' মানটি 'name' প্যারামিটার হিসেবে পাস হবে */এই কলটি greet ফাংশনকে "Rexx" পাঠাবে, এবং আউটপুট হবে:
Hello, RexxMultiple Parameters (একাধিক প্যারামিটার):
Rexx-এ একাধিক প্যারামিটারও পাস করা যায়। আপনি একাধিক প্যারামিটার parse arg কমান্ড দিয়ে গ্রহণ করতে পারেন।
add_numbers: procedure
parse arg num1 num2
result = num1 + num2
say "The sum is: " result
returnএখানে num1 এবং num2 প্যারামিটার হিসেবে দুটি সংখ্যার মান পাস করা হবে।
ফাংশন কল:
add_numbers 5 10আউটপুট:
The sum is: 152. Return Values (রিটার্ন ভ্যালু)
Rexx-এ ফাংশন থেকে মান ফেরত (return) করা খুবই সহজ। ফাংশন একটি মান ফেরত দিতে return কীওয়ার্ড ব্যবহার করে।
ফাংশন থেকে মান রিটার্ন করা:
যত সহজভাবে আপনি প্যারামিটার পাস করতে পারেন, তেমনই রিটার্ন ভ্যালু ব্যবহারের মাধ্যমে আপনি ফলাফল ফেরত দিতে পারেন।
multiply: procedure
parse arg num1 num2
result = num1 * num2
return result /* ফলাফল রিটার্ন করা */এখানে multiply ফাংশন দুটি সংখ্যার গুণফল বের করে এবং result মানটি রিটার্ন করে।
ফাংশন কল এবং রিটার্ন ভ্যালু গ্রহণ করা:
ফাংশন কল করার সময়, আপনি সরাসরি ফাংশনটি থেকে মান পেতে পারেন।
result = multiply 4 5
say "The result is: " resultআউটপুট:
The result is: 20এই ক্ষেত্রে multiply ফাংশনটি ৪ এবং ৫ গুণ করে এবং তার ফলাফল result পরিবর্তনশীলের মধ্যে রাখা হয়।
3. Returning Multiple Values (একাধিক মান রিটার্ন করা)
Rexx-এ আপনি একাধিক মানও ফেরত দিতে পারেন। এটি করা হয় একটি স্ট্রিং বা লিস্টের মাধ্যমে। আপনি একাধিক মান একটি প্যারামিটার হিসাবে ফেরত দিতে পারেন এবং পরে সেগুলিকে আলাদা করতে পারেন।
get_min_max: procedure
parse arg num1 num2 num3
min = num1
max = num1
if num2 < min then min = num2
if num3 < min then min = num3
if num2 > max then max = num2
if num3 > max then max = num3
return min max /* একাধিক মান রিটার্ন করা */ফাংশন কল এবং একাধিক মান গ্রহণ করা:
minValue maxValue = get_min_max 10 20 5
say "Min Value: " minValue
say "Max Value: " maxValueআউটপুট:
Min Value: 5
Max Value: 20সারাংশ:
- Function Parameters Passing: Rexx-এ ফাংশনে প্যারামিটার পাস করা হয় সহজে
parse argকমান্ড দিয়ে। আপনি একাধিক প্যারামিটারও পাস করতে পারেন। - Return Values: ফাংশন থেকে মান ফেরত দিতে
returnকমান্ড ব্যবহার করা হয়। একাধিক মান ফেরত দিতে আপনি একটি স্ট্রিং বা লিস্ট ব্যবহার করতে পারেন। - Rexx এর ফাংশন প্রক্রিয়া খুবই সোজা এবং পরিষ্কার, যা প্রোগ্রামিংকে সহজ করে তোলে।
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