প্রোগ্রামিংয়ে, রিকার্শন হল সেই প্রসেস যেখানে একটি ফাংশন সরাসরি বা পরোক্ষভাবে নিজেই নিজেকে কল করে। কম্পিউটার সায়েন্সের অনেক সমস্যা সমাধানে রিকার্শন ব্যবহার করা হয়।
জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ রিকার্সিভ মেথড তৈরি করতে সাপোর্ট করে, যা এমন মেথড যা নিজেকে কল করে।
এই টিউটোরিয়ালে উদাহরণসহ রিকার্শন কীভাবে কাজ করে এবং জাভাতে রিকার্সিভ ফাংশন কীভাবে তৈরি করতে হয় তা আলোচনা করা হয়েছে। এই গাইড পড়া শেষে আপনি জাভাতে রিকার্সিভ মেথড লিখতে পারবেন।
জাভা মেথড
মেথড, যাকে ফাংশনও বলা হয়, হল একটি নির্দিষ্ট টাস্ক সম্পাদন করার কোড ব্লক। উদাহরণস্বরূপ, একটি মেথড ব্যবহার করা হয়ে একটি অ্যারে মানগুলোর যোগফল ক্যালকুলেট করা বা অ্যারের কন্টেন্ট কনসোলে প্রিন্ট করা যায়।
জাভাতে মেথডের সিনট্যাক্স নিচে দেওয়া হলো:
modifier static returnType methodName (Parameters) { // Method body }
উদাহরণস্বরূপ, ধরা যাক আপনি একটি মেথড তৈরি করতে চান যা কনসোলে "It's Wednesday! We're half-way through the week!" প্রিন্ট করবে। আপনি নিচের কোড ব্যবহার করে এটি করতে পারেন:
class Main { public static void printItsWednesday() { System.out.println("It's Wednesday! We're half-way through the week!"); } public static void main(String[] args) { printItsWednesday(); } }
যখন আমরা printItsWednesday() ব্যবহার করে এই মেথড কল করি, নিচের আউটপুট রিটার্ন হয়:
It's Wednesday! We're half-way through the week!
যদি আপনি জাভা মেথড সম্পর্কে আরও জানতে চান, আপনি আমাদের জাভাতে মেথডের সম্পূর্ণ গাইড এখানে পড়তে পারেন।
উপরের উদাহরণে, আমরা মেইন প্রোগ্রামে printItsWednesday() মেথড কল করি। কিন্তু যদি আমরা আমাদের মেথডকে মেথডের ভেতরেই কল করতাম, তবে আমরা একটি রিকার্সিভ মেথড তৈরি করতাম।
জাভা রিকার্শন
রিকার্সিভ মেথড হল এমন মেথড যা প্রথমে মেইন মেথডে কল করা হয় এবং তারপর মেথডের ভেতরেই নিজেকে কল করা হয়। রিকার্সিভ মেথডের সিনট্যাক্স নিচে দেওয়া হলো:
static void executeMethod() { // এখানে কোড executeMethod(); // এটি আমাদের রিকার্সিভ কল // এখানে কোড } public static void main(String[] args) { executeMethod(); // এটি নরমাল মেথড কল }
যখন আমরা আমাদের প্রোগ্রাম রান করি, executeMethod() মেথড আমাদের মেইন প্রোগ্রামে কল হয়। এটি executeMethod() মেথডের কোড রান করতে বাধ্য করে, যা এই ক্ষেত্রে executeMethod() মেথডটিই অন্তর্ভুক্ত করে। তাই, যখন আমাদের প্রোগ্রাম রান করে, এটি একটি লুপে ঢুকে যায়।
প্রোগ্রাম executeMethod() মেথড এক্সিকিউট করতে থাকবে যতক্ষণ না এমন একটি কন্ডিশন পূরণ হয় যা এটিকে চলতে বাধা দেয়। যদি রিকার্শন রোকার জন্য কোনো কন্ডিশন নির্দিষ্ট না করা হয়, তবে প্রোগ্রাম চিরকাল চলবে। এটিকে ইনফাইনিট রিকার্শন বলা হয়।
কেন রিকার্শন ব্যবহার করবেন? প্রথম, রিকার্শন নির্দিষ্ট কেসে প্রোগ্রামের টাইম কমপ্লেক্সিটি কমাতে পারে। دوم, রিকার্শন কিছু অ্যালগরিদম আরও রিডেবল এবং মেইনটেইনেবলভাবে ইমপ্লিমেন্ট করতে সাহায্য করতে পারে।
রিকার্শন ব্যবহার করে লেখা কিছু প্রোগ্রামের উদাহরণ:
- ফিবোনাচি সিকোয়েন্স ক্যালকুলেট করা
- স্ট্রিং রিভার্স করা
- একটি সংখ্যার ফ্যাক্টোরিয়াল ক্যালকুলেট করা
- বাইনারি ট্রির হাইট ক্যালকুলেট করা
そう言うと, রিকার্শন একটি স্ট্যান্ডার্ড মেথড থেকে ধীর হতে পারে। কারণ রিকার্শন প্রতিবার রিকার্সিভ মেথড এক্সিকিউট হলে ভেরিয়েবলের জন্য নতুন স্টোরেজ লোকেশন তৈরি করে।
জাভা রিকার্শন উদাহরণ
রিকার্শন জাভায় কীভাবে কাজ করে তা প্রদর্শন করার জন্য দুটি উদাহরণ দেখা যাক।
রিকার্শন ব্যবহার করে স্ট্রিং রিভার্স করা
মনে করুন আমরা একটি মিডল স্কুল টিচারের জন্য একটি প্রোগ্রাম তৈরি করছি যা বছরের সারাটা একটি ছাত্রের গ্রেড ধারণকারী একটি স্ট্রিং রিভার্স করবে। স্ট্রিংটি ছাত্র পাওয়া প্রথম গ্রেড দিয়ে শুরু হয় এবং ছাত্র যা последন গ্রেড পেয়েছে সেটি দিয়ে শেষ হয়। আমরা স্ট্রিংটি রিভার্স করতে চাই যাতে ছাত্রের অর্জিত শেষ বা সাম্প্রতিক গ্রেড স্ট্রিংয়ের প্রথমে আসে।
স্ট্রিং রিভার্স করার জন্য আমরা নিচের কোড ব্যবহার করতে পারি:
public class ReverseGrades { public static String reverse(String grades) { if (grades.isEmpty()) return grades; return reverse(grades.substring(1)) + grades.charAt(0); } public static void main(String[] args) { String grades = "CBCBAABACAABA"; String reverse_grades = reverse(grades); System.out.println("এই ছাত্রের বছরের গ্রেডগুলো: " + reverse_grades); } }
আমাদের কোড রিটার্ন করে:
এই ছাত্রের বছরের গ্রেডগুলো: ABAACABAABCBC
আপনি দেখতে পাচ্ছেন, আমাদের প্রোগ্রাম আমাদের স্ট্রিংর কন্টেন্ট রিভার্স করেছে। আমাদের প্রোগ্রামে, আমরা reverse() নামে একটি রিকার্সিভ ফাংশন তৈরি করেছি।
যখন reverse() ফাংশন এক্সিকিউট হয়, প্রথমে চেক করা হয় যে grades স্ট্রিং খালি কিনা। যদি খালি হয়, তবে আমরা গ্রেড লিস্টকে মেইন প্রোগ্রামে রিটার্ন করি। এটি রিকার্শন রোকায় কারণ ফাংশনের শেষে reverse() কলটি রান করার সুযোগ পায় না।
যদি grades স্ট্রিং খালি না হয়, তবে আমাদের প্রোগ্রাম আবার reverse() মেথড এক্সিকিউট করবে এবং ফাংশনের ফলাফলকে সেন্টেন্সের প্রথম ক্যারেক্টারসহ কনক্যাটিনেট করবে। আমাদের উদাহরণে প্রথম ক্যারেক্টার রিট্রিভ করতে charAt() মেথড ব্যবহার করা হয়েছে এবং এটিকে reverse() মেথডের বাম পাশে যোগ করা হয়েছে।
আমাদের স্ট্রিং রিভার্স হওয়ার পর, এই ছাত্রের বছরের গ্রেডগুলো: মেসেজটি রিভার্সড স্ট্রিংসহ প্রোগ্রামে রিটার্ন করা হয়।
রিকার্শন ব্যবহার করে ফ্যাক্টোরিয়াল ক্যালকুলেট করা
রিকার্শন কার্যকর হতে পারে এমন আরেকটি ক্ষেত্র হল একটি সংখ্যার ফ্যাক্টোরিয়াল ক্যালকুলেট করা।
গণিতে, ফ্যাক্টোরিয়াল হল একটি সংখ্যা বা তার চেয়ে ছোট সব পজিটিভ ইন্টিজারকে একসাথে গুণ করে পাওয়া প্রোডাক্ট। উদাহরণস্বরূপ, ৫-এর ফ্যাক্টোরিয়াল ৫*৪*৩*২*১ এর সমান, যা ১২০। যেহেতু ফ্যাক্টোরিয়াল মেথডে পুনরাবৃত্তিমূলক ক্যালকুলেশন থাকে, তাই এটি একটি বাস্তব জীবনের উদাহরণ যেখানে সমস্যা সমাধানে রিকার্শন কার্যকর হতে পারে।
নিচের জাভা প্রোগ্রাম আমাদের জাভাতে ৭ সংখ্যার ফ্যাক্টোরিয়াল ক্যালকুলেট করতে দেয়:
class Main { static int calculateFactorial(int number) { if (number != 0) return number * calculateFactorial(number-1); else return 1; } public static void main(String[] args) { int num = 7; int answer = calculateFactorial(num); System.out.println("৭-এর ফ্যাক্টোরিয়াল: " + answer); } }
আমাদের কোড রিটার্ন করে:
৭-এর ফ্যাক্টোরিয়াল: 5040
এই উদাহরণে, আমরা calculateFactorial() নামে একটি মেথড তৈরি করেছি যা number প্যারামিটারে সংরক্ষিত সংখ্যাকে পরবর্তী calculateFactorial() মেথডের ফলাফলের সাথে গুণ করে। এই প্রসেস চলতে থাকে যতক্ষণ না number প্যারামিটার ০ এর সমান হয়।
যখন number প্যারামিটার ০ এর সমান হয়, আমাদের কোডের if স্টেটমেন্ট ১ রিটার্ন করে এবং calculateFactorial() মেথডের ফলাফল মেইন প্রোগ্রামে পাস করা হয়।
তাই, calculateFactorial() মেথড ৭*৬*৫*৪*৩*২*১ পারফর্ম করে, তারপর উত্তরটি মেইন প্রোগ্রামে রিটার্ন করে। একবার উত্তর ক্যালকুলেট হলে, ৭-এর ফ্যাক্টোরিয়াল: মেসেজটি আমাদের প্রোগ্রাম দ্বারা ক্যালকুলেট করা উত্তরসহ কনসোলে প্রিন্ট হয়।
উপসংহার
রিকার্শন হল প্রোগ্রামিংয়ে একটি ধারণা যা এমন মেথডকে বর্ণনা করে যা নিজেকে কল করে। রিকার্সিভ মেথড उन কেসগুলোতে উপকারী হতে পারে যেখানে আপনাকে একই টাস্ক একাধিক বার রিপিট করতে হয় এবং বর্তমান ইটেরেশনে সেই টাস্কের পূর্ববর্তী ইটেরেশনের ফলাফল ব্যবহার করতে হয়।
এই টিউটোরিয়ালে জাভাতে রিকার্শনের বেসিক এবং রিকার্সিভ মেথড কীভাবে তৈরি করতে হয় তা আলোচনা করা হয়েছে। এছাড়া, এই টিউটোরিয়ালে রিকার্শনের দুটি উদাহরণ—স্ট্রিং রিভার্স করা এবং ফ্যাক্টোরিয়াল ক্যালকুলেট করা—দেখানো হয়েছে।
আপনি এখন জাভাতে রিকার্সিভ মেথড প্রফেশনালের মতো ব্যবহার করতে পারবেন!