রিকার্শন দিয়ে গুণফল (Multiplication) কী?
গুণফল বের করা হলো যোগফলের পুনরাবৃত্তি। a × b মানে a কে b বার যোগ করা। রিকার্শনে এটি বাস্তবায়ন করা যায়: multiply(a, b) = a + multiply(a, b-1), বেস কেস: multiply(a, 0) = 0।
ইনপুট ও আউটপুট উদাহরণ
ইনপুট:
Enter two number : 12 and 9
আউটপুট:
The product of 12 and 9 is 108
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_input_1, my_input_2
- ব্যবহারকারী থেকে দুটি সংখ্যা ইনপুট নিন
- রিকার্সিভ ফাংশন getproduct(a, b) ডিফাইন করুন:
- যদি a < b হয়, আর্গুমেন্ট স왪 করুন (অপ্টিমাইজেশন: ছোট সংখ্যা বার বার যোগ করলে দ্রুত)
- যদি b != 0 হয়, a + getproduct(a, b-1) রিটার্ন করুন
- অন্যথায় (b == 0) 0 রিটার্ন করুন
- ফাংশন কল করুন এবং ফলাফল প্রিন্ট করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া
import java.util.Scanner;
public class ProductRecursion {
public static void main(String[] args) {
int my_input_1, my_input_2;
System.out.println("Required packages have been imported");
Scanner my_scanner = new Scanner(System.in);
System.out.println("A reader object has been defined");
System.out.print("Enter the number : ");
my_input_1 = my_scanner.nextInt();
System.out.print("Enter the number : ");
my_input_2 = my_scanner.nextInt();
System.out.println("The product of " + my_input_1 + " and " + my_input_2 +
" is " + getproduct(my_input_1, my_input_2));
}
static int getproduct(int my_input_1, int my_input_2) {
if (my_input_1 < my_input_2)
return getproduct(my_input_2, my_input_1);
else if (my_input_2 != 0)
return (my_input_1 + getproduct(my_input_1, my_input_2 - 1));
else
return 0;
}
}
উদাহরণ ২: পূর্বনির্ধারিত মান ব্যবহার
public class ProductRecursion {
public static void main(String[] args) {
int my_input_1 = 12;
int my_input_2 = 9;
System.out.println("The two numbers are defined as " + my_input_1 + " and " + my_input_2);
System.out.println("The product of " + my_input_1 + " and " + my_input_2 +
" is " + getproduct(my_input_1, my_input_2));
}
static int getproduct(int my_input_1, int my_input_2) {
if (my_input_1 < my_input_2)
return getproduct(my_input_2, my_input_1);
else if (my_input_2 != 0)
return (my_input_1 + getproduct(my_input_1, my_input_2 - 1));
else
return 0;
}
}
রিকার্শন ট্রেস (12 × 9)
অপ্টিমাইজেশন: 12 < 9 মিথ্যা, তাই স্ব্যাপ হয়না। 9 বার 12 যোগ হবে।
getproduct(12, 9) = 12 + getproduct(12, 8) = 12 + 12 + getproduct(12, 7) = 12 + 12 + 12 + getproduct(12, 6) = 12 + 12 + 12 + 12 + getproduct(12, 5) = 12 + 12 + 12 + 12 + 12 + getproduct(12, 4) = 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 3) = 12 + 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 2) = 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 1) = 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 0) = 12 × 9 + 0 = 108
কোড ব্যাখ্যা
- স್ವ্যাপ অপ্টিমাইজেশন: if (a < b) swap → কম ইটারেশনে বড় সংখ্যা যোগ হয়
- বেস কেস: b == 0 হলে 0 রিটার্ন (গুণনীয় অভিজ্ঞতা)
- রিকার্সিভ কেস: a + getproduct(a, b-1) → a কে b বার যোগ করা
নেগেটিভ সংখ্যা হ্যান্ডলিং
static int getproduct(int a, int b) {
// বেস কেস
if (b == 0) return 0;
// 네가েটিভ হ্যান্ডলিং
if (b < 0) return -getproduct(a, -b);
// পজিটিভ b এর জন্য
return a + getproduct(a, b - 1);
}
ইটারেটিভ সমাধান (প্রোডাকশন রেডি)
public static int multiply(int a, int b) {
int result = 0;
boolean negative = (a < 0) ^ (b < 0); // XOR
a = Math.abs(a);
b = Math.abs(b);
// অপ্টিমাইজেশন: ছোটটি লুপ কাউন্টার বানান
if (a < b) { int temp = a; a = b; b = temp; }
for (int i = 0; i < b; i++) {
result += a;
}
return negative ? -result : result;
}
রাশিয়ান পেজ্যান্ট মাল্টিপ্লিকেশন (O(log n))
public static int russianPeasant(int a, int b) {
int result = 0;
while (b > 0) {
if ((b & 1) != 0) result += a; // b বিজোড় হলে a যোগ করুন
a <<= 1; // a = a * 2
b >>= 1; // b = b / 2
}
return result;
}
সতর্কতা
- রিকার্শন দিয়ে গুণফল শুধু শেখার উদ্দেশ্যে - প্রোডাকশনে ব্যবহার করবেন না
- বড় সংখ্যার জন্য StackOverflowError হবে
- Integer overflow হ্যান্ডলিং দরকার (long বা BigInteger ব্যবহার করুন)