প্যাটার্ন ম্যাচিং (Pattern Matching) একটি শক্তিশালী বৈশিষ্ট্য যা স্কালাতে ডেটার উপর শর্তযুক্ত পরীক্ষা চালানোর একটি সহজ ও কার্যকর উপায়। এটি স্কালার ফাংশনাল প্রোগ্রামিং স্টাইলে ডেটা কনস্ট্রাক্ট ও কালেকশনগুলির ওপর কাজ করতে সাহায্য করে। স্কালাতে প্যাটার্ন ম্যাচিং ব্যবহার করে আপনি বিভিন্ন ধরণের ডেটার কাঠামো পরীক্ষা করতে পারেন এবং নির্দিষ্ট শর্তের ভিত্তিতে বিভিন্ন কাজ করতে পারেন। কালেকশনস (Collections) হল স্কালার ডেটা স্ট্রাকচার যেগুলি প্যাটার্ন ম্যাচিং এর মাধ্যমে সহজে হ্যান্ডল করা যায়।
প্যাটার্ন ম্যাচিং (Pattern Matching)
প্যাটার্ন ম্যাচিং স্কালাতে একটি প্রক্রিয়া যেখানে আপনি ডেটার উপর বিভিন্ন শর্ত প্রয়োগ করে ফলাফল বের করতে পারেন। এটি একাধিক শর্তের ভিত্তিতে কোডের বিভিন্ন অংশে প্রবাহ পরিচালনা করতে সহায়ক। স্কালাতে প্যাটার্ন ম্যাচিং এর সাহায্যে আপনি কোনো ডেটা টাইপের সাথে সম্পর্কিত শর্তগুলিকে সহজভাবে চিহ্নিত এবং পরীক্ষা করতে পারেন।
উদাহরণ:
val number = 10
number match {
case 1 => println("One")
case 2 => println("Two")
case 10 => println("Ten")
case _ => println("Other") // Default case
}এখানে, number match এর মাধ্যমে 10 মিলে গেলে "Ten" প্রিন্ট হবে। _ হলো ডিফল্ট কেস, যা অন্য কোনো মানের জন্য কাজ করবে।
প্যাটার্ন ম্যাচিং ব্যবহার কালেকশনসের সাথে
স্কালাতে প্যাটার্ন ম্যাচিং ব্যবহার করে আপনি বিভিন্ন ধরনের কালেকশনের উপাদানগুলির উপর পরীক্ষা করতে পারেন। আপনি List, Set, Map ইত্যাদি কালেকশন এর ভিতরে থাকা উপাদানগুলির উপর প্যাটার্ন ম্যাচিং ব্যবহার করে কাজ করতে পারেন।
উদাহরণ: List-এর উপর প্যাটার্ন ম্যাচিং
val numbers = List(1, 2, 3, 4, 5)
numbers match {
case Nil => println("Empty List")
case head :: tail => println(s"Head: $head, Tail: $tail")
}এখানে, Nil খালি লিস্টের জন্য এবং head :: tail উপাদানের প্রথমটি head হিসেবে এবং বাকি অংশটি tail হিসেবে ধরছে।
উদাহরণ: Set-এর উপর প্যাটার্ন ম্যাচিং
val numbersSet = Set(1, 2, 3)
numbersSet match {
case Set(1, 2, _*) => println("Set contains 1 and 2")
case _ => println("Other Set")
}এখানে, Set(1, 2, _*) প্যাটার্ন ব্যবহার করা হয়েছে, যেখানে _ * মানে যেকোনো পরিমাণ উপাদান হতে পারে।
প্যাটার্ন ম্যাচিং সহ Map
Map কালেকশন একটি কীগুলির সাথে মান সংরক্ষণ করে, এবং প্যাটার্ন ম্যাচিং ব্যবহার করে আমরা সহজেই কোনো কীগুলোর মান বের করতে পারি।
উদাহরণ: Map-এর উপর প্যাটার্ন ম্যাচিং
val fruitPrices = Map("Apple" -> 3, "Banana" -> 1, "Orange" -> 2)
fruitPrices.get("Apple") match {
case Some(price) => println(s"Apple costs $price")
case None => println("Apple not found")
}এখানে, get মেথডটি মান ফেরত দেয়, এবং Some(price) অথবা None প্যাটার্ন ম্যাচিং এর মাধ্যমে আমরা ফলাফলটি পরীক্ষা করি।
প্যাটার্ন ম্যাচিংয়ের সুবিধা:
- সহজ এবং পরিষ্কার কোড: প্যাটার্ন ম্যাচিং কোডকে অনেক পরিষ্কার এবং সহজে বোঝার যোগ্য করে তোলে। এটি
if-elseবাswitch-caseএর চেয়ে বেশি শক্তিশালী এবং নমনীয়। - ফাংশনাল প্রোগ্রামিং স্টাইল: প্যাটার্ন ম্যাচিং ফাংশনাল প্রোগ্রামিং ধারণা সহ ব্যবহার করা যায়, যেহেতু এটি ইমমিউটেবল ডেটা স্ট্রাকচার এবং ডেটা ট্রান্সফরমেশন সাপোর্ট করে।
- ডেটা ডিকন্সট্রাকশন: আপনি প্যাটার্ন ম্যাচিং ব্যবহার করে ডেটাকে সহজে ডিকন্সট্রাক্ট (destructure) করতে পারেন, যেমন লিস্ট বা টুপল থেকে পৃথক পৃথক মান বের করা।
সারাংশ
প্যাটার্ন ম্যাচিং এবং কালেকশনস স্কালাতে একটি অত্যন্ত শক্তিশালী বৈশিষ্ট্য যা ডেটা কাঠামো অনুসারে অপারেশন চালানোর জন্য সহজ এবং পরিষ্কার উপায় প্রদান করে। কালেকশনের উপর প্যাটার্ন ম্যাচিং ব্যবহার করে আপনি সহজেই লিস্ট, সেট, ম্যাপের উপাদানগুলির উপর পরীক্ষা চালাতে এবং প্রক্রিয়া করতে পারেন। এটি ফাংশনাল প্রোগ্রামিং স্টাইল অনুসরণ করে, এবং কোডের পুনঃব্যবহারযোগ্যতা এবং ম্যানেজেবিলিটি বাড়াতে সাহায্য করে।
Pattern Matching (প্যাটার্ন ম্যাচিং) হল একটি শক্তিশালী বৈশিষ্ট্য যা স্কালা (Scala) সহ অনেক ফাংশনাল প্রোগ্রামিং ভাষায় ব্যবহার করা হয়। এটি ডেটা স্ট্রাকচার বা অবজেক্টগুলির সাথে কাজ করার একটি প্রক্রিয়া, যেখানে ডেটার ভ্যালু বা গঠন অনুযায়ী সিদ্ধান্ত গ্রহণ করা হয়। Collections (কালেকশনস) স্কালার এমন ডেটা স্ট্রাকচার যা বিভিন্ন উপাদান বা আইটেম ধারণ করে, এবং pattern matching এই ডেটাগুলোর উপর অপারেশন বা কার্যাবলী প্রয়োগ করতে সাহায্য করে। এর মাধ্যমে আমরা একাধিক ধরণের ডেটা স্ট্রাকচারকে আরও সহজভাবে পরীক্ষা করতে পারি এবং তাদের সাথে কার্যকরীভাবে কাজ করতে পারি।
Pattern Matching এর ধারণা
Pattern matching হলো একটি প্রক্রিয়া যেখানে কোনো মান বা ডেটার গঠন (structure) চিহ্নিত করা হয় এবং তার ভিত্তিতে কার্যাবলী নির্ধারণ করা হয়। এটি সাধারণত match কিওয়ার্ডের মাধ্যমে স্কালায় ব্যবহৃত হয়। Pattern matching-এর মাধ্যমে আমরা ডেটার বিভিন্ন ধরণ এবং গঠন অনুযায়ী বিভিন্ন কোড ব্লক চালাতে পারি।
Collections এর সাথে Pattern Matching
স্কালাতে Collections (যেমন List, Set, Map, Vector) এবং Pattern Matching একসাথে ব্যবহার করে খুব সহজে এবং স্বচ্ছভাবে ডেটা প্রক্রিয়া করা যায়। নিচে কিছু উদাহরণ দেওয়া হলো যেখানে Collections এর সাথে Pattern Matching ব্যবহার করা হয়েছে।
উদাহরণ ১: List এর সাথে Pattern Matching
val numbers = List(1, 2, 3, 4, 5)
numbers match {
case Nil => println("Empty List")
case head :: tail => println(s"Head: $head, Tail: $tail")
}এখানে, List-এর প্রথম উপাদান (head) এবং বাকি উপাদানগুলো (tail) কে আলাদা করা হয়েছে। :: অপারেটরটি List-এর প্রথম উপাদান এবং বাকি উপাদানগুলো আলাদা করতে সাহায্য করে।
উদাহরণ ২: Set এর সাথে Pattern Matching
val numbersSet = Set(1, 2, 3)
numbersSet match {
case Set(1, 2, 3) => println("Set contains 1, 2, and 3")
case Set(1, _*) => println("Set starts with 1")
case _ => println("Other Set")
}এখানে, Set-এর ভিতরের নির্দিষ্ট উপাদান চিহ্নিত করার জন্য Pattern Matching ব্যবহার করা হয়েছে।
উদাহরণ ৩: Map এর সাথে Pattern Matching
val user = Map("name" -> "Alice", "age" -> 25)
user match {
case Map("name" -> name, "age" -> age) => println(s"Name: $name, Age: $age")
case _ => println("Unknown user")
}এখানে, Map-এর key-value পেয়ারের উপর Pattern Matching ব্যবহার করা হয়েছে। যদি map-এর মধ্যে "name" এবং "age" কী থাকে, তবে সেগুলির মান বের করা হয়েছে।
Pattern Matching এর সুবিধা
- সহজ এবং পরিষ্কার কোড
Pattern matching ব্যবহার করে জটিল কোড সহজ এবং পরিষ্কার করা যায়, কারণ এটি ডেটার গঠন অনুযায়ী সিদ্ধান্ত নেয় এবং কোড লিখতে সহজ হয়। - ভালোভাবে ডেটা বিশ্লেষণ
Collections-এর মধ্যে থাকা ডেটার গঠন খুব সহজে বের করা যায়। যেমন, List, Set, Map ইত্যাদি কালেকশনের ভেতর থাকা উপাদানগুলোকে খোঁজা বা প্রক্রিয়া করা আরও সহজ হয়ে ওঠে। - ডেটা নিরাপত্তা
Pattern Matching, কল্যাণকরভাবে ডেটার গঠন চিহ্নিত করার মাধ্যমে কোডের মধ্যে ইরর কম করে, কারণ এটি ডেটার ধরন অনুসারে আলাদা আলাদা প্রক্রিয়া চালাতে সাহায্য করে। - নতুন ডেটা স্ট্রাকচার সহজে তৈরি করা
Pattern matching-এর মাধ্যমে নতুন ডেটা স্ট্রাকচার তৈরি করা এবং তাদের উপাদানগুলো চিহ্নিত করে কাজ করা অনেক বেশি নমনীয় এবং কার্যকরী।
সারাংশ
Collections এবং Pattern Matching একে অপরের সাথে খুবই শক্তিশালী সমন্বয় তৈরি করে। Pattern matching-এ বিভিন্ন ধরনের ডেটা স্ট্রাকচারের উপর কাজ করার ক্ষমতা থাকায়, Collections-এর উপাদানগুলির গঠন অনুযায়ী সিদ্ধান্ত গ্রহণ করা সম্ভব হয়। এটি কোডের পুনঃব্যবহারযোগ্যতা, ডেটা বিশ্লেষণ এবং কোডের পরিষ্কারতা বৃদ্ধি করে, যা ডেভেলপমেন্ট প্রক্রিয়াকে আরও কার্যকরী এবং দক্ষ করে তোলে।
স্কালাতে প্যাটার্ন ম্যাচিং একটি শক্তিশালী বৈশিষ্ট্য যা ডেটা স্ট্রাকচারগুলোকে সহজে পরীক্ষা এবং পৃথক করতে ব্যবহৃত হয়। এটি সাধারণত match এবং case শব্দ ব্যবহার করে করা হয় এবং ডেটার কাঠামো বা কন্টেন্টের উপর ভিত্তি করে বিভিন্ন ক্ষেত্রে পৃথক মান বের করা যায়। Lists এবং Tuples এর ক্ষেত্রে প্যাটার্ন ম্যাচিং বিশেষভাবে কার্যকর, কারণ এই ডেটা স্ট্রাকচারগুলির উপাদানগুলোর উপর ভিত্তি করে প্যাটার্ন তৈরি করা সহজ।
লিস্টের জন্য প্যাটার্ন ম্যাচিং (Pattern Matching for Lists)
স্কালাতে, লিস্টের জন্য প্যাটার্ন ম্যাচিং খুবই জনপ্রিয় এবং এটি সাধারণত লিস্টের প্রথম উপাদান বা অবশিষ্ট অংশ (tail) আলাদা করতে ব্যবহৃত হয়। নিচে একটি উদাহরণ দেখানো হলো:
val list = List(1, 2, 3, 4, 5)
list match {
case Nil => println("লিস্টটি খালি")
case head :: tail => println(s"প্রথম উপাদান: $head, অবশিষ্ট উপাদান: $tail")
}এখানে:
Nil: এটি খালি লিস্টকে উপস্থাপন করে।head :: tail: এটি লিস্টের প্রথম উপাদান (head) এবং বাকি অংশ (tail) আলাদা করে।::অপারেটর ব্যবহার করা হয় লিস্টের প্রথম উপাদানকে আলাদা করার জন্য।
উপরে প্রদত্ত কোডের আউটপুট হবে:
প্রথম উপাদান: 1, অবশিষ্ট উপাদান: List(2, 3, 4, 5)টুপলের জন্য প্যাটার্ন ম্যাচিং (Pattern Matching for Tuples)
টুপল একাধিক উপাদান ধারণ করতে পারে এবং টুপলের জন্য প্যাটার্ন ম্যাচিং খুবই সহজ। আপনি টুপলের প্রতিটি উপাদানকে আলাদা করে পরীক্ষা করতে পারেন।
val tuple = (1, "Scala", 3.14)
tuple match {
case (a, b, c) => println(s"প্রথম উপাদান: $a, দ্বিতীয় উপাদান: $b, তৃতীয় উপাদান: $c")
}এখানে, case (a, b, c) প্যাটার্ন টুপলের তিনটি উপাদানকে পৃথক পৃথক ভেরিয়েবলে ধরে নেয়।
উপরে প্রদত্ত কোডের আউটপুট হবে:
প্রথম উপাদান: 1, দ্বিতীয় উপাদান: Scala, তৃতীয় উপাদান: 3.14লিস্ট এবং টুপল প্যাটার্ন ম্যাচিংয়ের আরও কিছু উদাহরণ
- লিস্টের প্যাটার্ন ম্যাচিং (Pattern Matching on Lists):
val list1 = List(1, 2, 3)
val list2 = List(5, 6, 7, 8)
list1 match {
case x :: y :: Nil => println(s"দুটি উপাদান: $x এবং $y") // দুই উপাদান বিশিষ্ট লিস্ট
case _ => println("অন্য কিছু")
}এই কোডে x :: y :: Nil লিস্টের দুটি উপাদান ধরে এবং কিছু করার চেষ্টা করবে। যদি লিস্টের আকার তা না হয়, তবে case _ অংশটি কার্যকর হবে।
- টুপল প্যাটার্ন ম্যাচিং (Pattern Matching on Tuples):
val tuple = (3, "Hello", true)
tuple match {
case (3, "Hello", true) => println("সঠিক টুপল")
case _ => println("ভিন্ন টুপল")
}এখানে, টুপলটি ঠিক (3, "Hello", true) হলে "সঠিক টুপল" মুদ্রিত হবে। অন্য কিছু হলে "ভিন্ন টুপল" মুদ্রিত হবে।
সারাংশ
লিস্ট এবং টুপল এর জন্য প্যাটার্ন ম্যাচিং ফাংশনাল প্রোগ্রামিংয়ের একটি শক্তিশালী কৌশল যা কোডকে আরও পরিষ্কার এবং সোজা করে তোলে। এটি ব্যবহার করে আপনি দ্রুত এবং সহজে ডেটা স্ট্রাকচারগুলির মধ্যে তথ্য যাচাই এবং পৃথক করতে পারেন। স্কালাতে প্যাটার্ন ম্যাচিং লিস্টের উপাদান এবং টুপলের মানকে পৃথকভাবে আলাদা করার জন্য অত্যন্ত কার্যকর।
স্কালাতে, match expressions এবং destructuring (বিভাজন) খুবই শক্তিশালী বৈশিষ্ট্য। এই দুটি ব্যবহার করে আপনি ডেটা স্ট্রাকচারগুলোকে খুব সহজে পরীক্ষা এবং প্রসেস করতে পারেন। এটি কোডকে আরও পরিষ্কার, কার্যকরী এবং রিডেবল করে তোলে।
Match Expressions
match expressions হলো একটি বিশেষ ধরনের কন্ডিশনাল স্টেটমেন্ট যা আপনাকে ডেটার উপর বিভিন্ন শর্ত পরীক্ষা করার সুযোগ দেয়, যেমন switch স্টেটমেন্ট, কিন্তু আরও শক্তিশালী এবং নমনীয়। স্কালাতে, match একাধিক শর্ত পরীক্ষা করার জন্য ব্যবহৃত হয় এবং এটি pattern matching এর ভিত্তিতে কাজ করে। এটি যে কোনো ধরনের ডেটার সাথে কাজ করতে পারে, যেমন ক্লাস, তালিকা, ট্যাপল, অথবা এমনকি option টাইপ।
উদাহরণ ১: সাধারণ match ব্যবহার
val day = "Monday"
day match {
case "Monday" => println("Start of the work week.")
case "Friday" => println("Almost weekend!")
case _ => println("Middle of the week.")
}এখানে, আমরা day নামক একটি ভেরিয়েবলের মানের উপর match এক্সপ্রেশন চালাচ্ছি। case _ অর্থ হল অন্যান্য সব পরিস্থিতি (default case)।
উদাহরণ ২: Option টাইপের সাথে match
val maybeNumber: Option[Int] = Some(42)
maybeNumber match {
case Some(x) => println(s"Found number: $x")
case None => println("No number found.")
}এখানে, Option টাইপের সাথে match এক্সপ্রেশন ব্যবহার করা হয়েছে। Some(x) প্যাটার্নটি Option এর ভিতরের মানটি এক্সট্র্যাক্ট করে, এবং None প্যাটার্নটি কোনো মান না থাকার অবস্থাটি পরীক্ষা করে।
Destructuring
Destructuring হল একটি পদ্ধতি যা আপনাকে একটি ডেটা স্ট্রাকচারের ভিতরের উপাদানগুলো সহজভাবে আলাদা করতে দেয়, যাতে আপনি সেগুলো পৃথক ভেরিয়েবলে অ্যাসাইন করতে পারেন। স্কালাতে, match expressions এবং case statements ব্যবহার করে destructuring করা সম্ভব।
উদাহরণ ১: ট্যাপল (Tuple) এর সাথে Destructuring
val person = ("John", 30)
person match {
case (name, age) => println(s"Name: $name, Age: $age")
}এখানে, person নামক ট্যাপলটি দুটি উপাদানে বিভক্ত (destructured) হচ্ছে—name এবং age।
উদাহরণ ২: লিস্টের সাথে Destructuring
val numbers = List(1, 2, 3)
numbers match {
case first :: second :: rest =>
println(s"First: $first, Second: $second, Rest: $rest")
case _ => println("List is too short!")
}এখানে, :: অপারেটরটি একটি লিস্টের প্রথম দুটি উপাদানকে আলাদা (destructure) করছে এবং বাকী উপাদানগুলোকে rest নামে একটি লিস্টে রাখছে।
উদাহরণ ৩: ক্লাসের সাথে Destructuring
case class Person(name: String, age: Int)
val person = Person("Alice", 25)
person match {
case Person(name, age) => println(s"Name: $name, Age: $age")
}এখানে, Person ক্লাসের ভিতরের উপাদানগুলোকে destructure করা হচ্ছে, যাতে আমরা name এবং age ভেরিয়েবলগুলো পেতে পারি।
Match Expressions এবং Destructuring এর সুবিধা
- কোডের পরিস্কারতা:
matchexpressions এবংdestructuringকোডকে আরও পরিষ্কার এবং সহজবোধ্য করে তোলে, কারণ এটি ডেটা এক্সট্র্যাক্ট করতে কোন অতিরিক্ত কোডের প্রয়োজন হয় না। - ডেটা স্ট্রাকচার পরীক্ষা:
আপনি সহজে বিভিন্ন ধরনের ডেটা স্ট্রাকচার (যেমন ট্যাপল, লিস্ট, ক্লাস, বাOption) পরীক্ষা এবং তাদের উপাদানগুলোকে আলাদা করতে পারেন। - ফাংশনাল প্রোগ্রামিং:
এটি ফাংশনাল প্রোগ্রামিং স্টাইলের জন্য একটি অপরিহার্য বৈশিষ্ট্য, যেখানে আপনি সাধারণভাবে একাধিক শর্ত চেক করে ডেটাকে সঠিকভাবে প্রক্রিয়া করতে পারেন।
সারাংশ
স্কালাতে, match expressions এবং destructuring দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডেটা স্ট্রাকচারগুলোর উপর কার্যকরীভাবে কাজ করতে সাহায্য করে। match expressions এর মাধ্যমে আপনি বিভিন্ন ধরনের প্যাটার্ন মেলানোর মাধ্যমে ডেটার উপাদানগুলো পরীক্ষা এবং প্রক্রিয়া করতে পারেন, এবং destructuring এর মাধ্যমে সহজে ডেটা স্ট্রাকচারের ভিতরের উপাদানগুলো আলাদা করতে পারেন। এর মাধ্যমে কোডের গঠন সহজ, পরিষ্কার এবং কার্যকরী হয়ে ওঠে।
Pattern Matching এবং Recursion দুটি শক্তিশালী বৈশিষ্ট্য যা স্কালার মতো ফাংশনাল প্রোগ্রামিং ভাষায় ব্যবহৃত হয়। এই দুটি ধারণা একত্রে ব্যবহার করলে কোড আরও সঠিক, পরিষ্কার এবং শক্তিশালী হয়। আসুন, এগুলির প্রত্যেকটির উদাহরণ দেখি।
১. Pattern Matching (প্যাটার্ন ম্যাচিং)
Pattern Matching হল একটি শক্তিশালী ফিচার যা স্কালাতে কন্ডিশনাল স্টেটমেন্টগুলির (যেমন if-else বা switch) বিকল্প হিসেবে কাজ করে। এটি ডেটার গঠন বা ধরন (যেমন ক্লাস, টিউপল, লিস্ট ইত্যাদি) অনুযায়ী ভিন্ন ভিন্ন কোডের ব্লক চালাতে সহায়ক।
উদাহরণ:
def describe(x: Any): String = x match {
case 1 => "এটি ১"
case "Hello" => "এটি একটি স্ট্রিং"
case _: Int => "এটি একটি পূর্ণসংখ্যা"
case _: String => "এটি একটি স্ট্রিং"
case _ => "অজানা ধরনের ডেটা"
}
println(describe(1)) // এটি ১
println(describe("Hello")) // এটি একটি স্ট্রিং
println(describe(42)) // এটি একটি পূর্ণসংখ্যা
println(describe(true)) // অজানা ধরনের ডেটাএখানে match ব্লকটি ডেটার ধরন অনুসারে কেসগুলোকে মেলে এবং সেই অনুযায়ী ফলাফল প্রদান করে। _: ব্যবহার করা হয়েছে টাইপ মেচিংয়ের জন্য (যেমন Int, String ইত্যাদি)।
২. Recursion (রিকারশন)
Recursion হল একটি ফাংশনের নিজেই নিজে কল করা, যেখানে একটি ছোট সমস্যাকে সমাধান করার জন্য বড় সমস্যাকে সমাধান করার জন্য একই ফাংশন বারবার ব্যবহার করা হয়। এটি বিশেষত গাণিতিক সমস্যা যেমন ফ্যাক্টোরিয়াল, ফিবোনাচ্চি সিরিজ ইত্যাদির জন্য ব্যবহৃত হয়।
উদাহরণ:
- ফ্যাক্টোরিয়াল (Factorial) রিকারশন উদাহরণ:
def factorial(n: Int): Int = {
if (n <= 1) 1
else n * factorial(n - 1)
}
println(factorial(5)) // 120এখানে factorial ফাংশনটি নিজেই নিজে কল করে (রিকারশন)। এটি একটি বেস কেস (if (n <= 1)) চেক করে, এবং সঠিক ফলাফল পেতে রিকারসিভ কল চালায়।
- ফিবোনাচ্চি (Fibonacci) সিরিজ রিকারশন উদাহরণ:
def fibonacci(n: Int): Int = {
if (n <= 1) n
else fibonacci(n - 1) + fibonacci(n - 2)
}
println(fibonacci(6)) // 8এখানে fibonacci ফাংশনটি ফিবোনাচ্চি সিরিজের Nতম উপাদান বের করার জন্য রিকারশন ব্যবহার করছে। fibonacci(n - 1) এবং fibonacci(n - 2) প্রতিটি কল করা হয় এবং একত্রিত হয়ে পরবর্তী মান প্রদান করে।
Pattern Matching এবং Recursion একসাথে ব্যবহার
Pattern Matching এবং Recursion একসাথে ব্যবহার করে কোড আরও পরিষ্কার এবং স্বাভাবিক হয়। নিচে একটি উদাহরণ দেওয়া হলো যেখানে লিস্টের উপর রিকারশন এবং প্যাটার্ন ম্যাচিং ব্যবহার করা হয়েছে।
উদাহরণ:
def sumList(xs: List[Int]): Int = xs match {
case Nil => 0 // যদি লিস্টটি খালি হয়
case head :: tail => head + sumList(tail) // হেডটি যোগ করে বাকি অংশের জন্য রিকারশন কল
}
println(sumList(List(1, 2, 3, 4, 5))) // 15এখানে, sumList ফাংশনটি লিস্টের উপাদানগুলির যোগফল বের করে। প্যাটার্ন ম্যাচিং ব্যবহার করা হয়েছে, যেখানে Nil একটি খালি লিস্ট এবং head :: tail একটি অ-খালি লিস্টের প্যাটার্ন হিসেবে কাজ করে। রিকারশন ব্যবহার করা হয়েছে উপাদানগুলিকে এক এক করে যোগ করার জন্য।
সারাংশ
- Pattern Matching হল এমন একটি ক্ষমতা যা ডেটার ধরন বা গঠন অনুযায়ী বিভিন্ন অ্যাকশন বাস্তবায়ন করতে সহায়ক হয়। এটি কোডকে আরও সহজ এবং পরিষ্কার করতে সাহায্য করে।
- Recursion হল একটি ফাংশনের নিজে নিজে কল করা। এটি বড় সমস্যাগুলিকে ছোট ছোট অংশে ভাগ করে এবং প্রতিটি অংশকে সমাধান করার জন্য ব্যবহার করা হয়।
এই দুটি ধারণা একত্রে স্কালাতে আরও শক্তিশালী এবং পরিষ্কার কোড লেখার জন্য সহায়ক।
Read more