রিকার্শন ব্যবহার করে গুণফল বের করা bedeutet পুনরাবৃত্তি যোগ (repeated addition) এর মাধ্যমে গুণফল বের করা: a × b = a + a + ... + a (b বার)।
বেসিক রিকার্সিভ লজিক
- বেস কেস: `b == 0` হলে `0` রিটার্ন
- রিকার্সিভ কেস: `a + Multiply(a, b - 1)`
সম্পূর্ণ উদাহরণ
using System;
public class Calculation
{
public static void Main()
{
int val1 = 10;
int val2 = 20;
Demo d = new Demo();
int res = d.Product(val1, val2);
Console.WriteLine($"{val1} × {val2} = {res}");
Console.ReadLine();
}
}
class Demo
{
public int Product(int val1, int val2)
{
// অপ্টিমাইজেশন: ছোট সংখ্যাকে কাউন্টার হিসেবে ব্যবহার করুন
if (val1 < val2)
return Product(val2, val1); // Swap করে রিকার্শন ডেপথ কমান
if (val2 == 0)
return 0;
return val1 + Product(val1, val2 - 1);
}
}
আউটপুট
10 × 20 = 200
সমস্যা: স্ট্যাক ওভারফ্লো রিস্ক
বড় `val2` এর জন্য (যেমন ১০০০০০) স্ট্যাক ওভারফ্লো হবে কারণ প্রতিটি রিকার্সিভ কল স্ট্যাক ফ্রেম যোগ করে।
অপ্টিমাইজড পদ্ধতিগুলো
১. রাশিয়ান পিজান্ট মাল্টিপ্লিকেশন (O(log n))
public static int MultiplyRussianPeasant(int a, int b)
{
int result = 0;
while (b > 0)
{
if ((b & 1) != 0) // b বিজোড় হলে
result += a;
a <<= 1; // a = a * 2
b >>= 1; // b = b / 2
}
return result;
}
২. বাইনরি এক্সপোনেনশিয়েশন-স্টাইল (O(log n) রিকার্সিভ)
public static int MultiplyFast(int a, int b)
{
if (b == 0) return 0;
if (b == 1) return a;
int half = MultiplyFast(a, b / 2);
if (b % 2 == 0)
return half + half;
else
return a + half + half;
}
৩. বিল্ট-ইন অপারেটর (সর্বোত্তম)
int result = val1 * val2; // CPU ইনস্ট্রাকশন, O(1)
নেগেটিভ সংখ্যা হ্যান্ডলিং
public static int MultiplyWithNegatives(int a, int b)
{
bool negativeResult = (a < 0) ^ (b < 0); // XOR: একটাই নেগেটিভ হলে
a = Math.Abs(a);
b = Math.Abs(b);
int result = MultiplyFast(a, b); // উপরের ফাস্ট মেথড
return negativeResult ? -result : result;
}
পারফরম্যান্স তুলনা (১০০০০ × ১০০০০)
| পদ্ধতি | টাইম কমপ্লেক্সিটি | স্ট্যাক স্পেস | নোট |
|---|---|---|---|
| নিবিড় রিকার্শন | O(b) | O(b) | স্ট্যাক ওভারফ্লো রিস্ক |
| রাশিয়ান পিজান্ট (ইটেরেটিভ) | O(log b) | O(1) | সর্বোত্তম ম্যানুয়াল ইমপ্লিমেন্টেশন |
| বাইনরি রিকার্শন | O(log b) | O(log b) | বালান্সড |
| নেটিভ `*` অপারেটর | O(1) হার্ডওয়্যার | O(1) | প্রোডাকশনে এটি ব্যবহার করুন |
শিক্ষামূলক মূল্য
রিকার্শন দিয়ে গুণফল বের করা মূলত:
- রিকার্শন কনসেপ্ট শেখানোর জন্য
- আলগরিদমিক চিন্তাভাবনা বিকাশের জন্য
- ইন্টারভিউ প্রশ্নের জন্য
রিয়াল ওয়ার্ল্ড অ্যাপ্লিকেশনে সবসময় `*` অপারেটর বা `Math.Multiply` ব্যবহার করুন।