রিকার্শন ব্যবহার করে একটি সংখ্যার সব ডিজিটের যোগফল (Sum of Digits) বের করা একটি ক্লাসিক রিকার্শন উদাহরণ। বেস কেস: ০ হলে ০ রিটার্ন। রিকার্সিভ কেস: শেষ ডিজিট (`n % 10`) + বাকি অংশের সাম (`Sum(n / 10)`)।
বেসিক রিকার্সিভ ইমপ্লিমেন্টেশন
using System;
class Demo
{
public static void Main(string[] args)
{
int n = 22;
Console.WriteLine($"সংখ্যা: {n}");
int result = SumOfDigits(n);
Console.WriteLine($"ডিজিট সাম: {result}");
}
static int SumOfDigits(int n)
{
if (n == 0) return 0; // বেস কেস
return (n % 10) + SumOfDigits(n / 10); // রিকার্সিভ কেস
}
}
আউটপুট
সংখ্যা: 22
ডিজিট সাম: 4
নেগেটিভ সংখ্যা হ্যান্ডলিং
static int SumOfDigits(int n)
{
n = Math.Abs(n); // নেগেটিভ হ্যান্ডল
if (n == 0) return 0;
return (n % 10) + SumOfDigits(n / 10);
}
ইটেরেটিভ ভার্সন (স্ট্যাক ওভারফ্লো এড়াতে, দ্রুত)
static int SumOfDigitsIterative(int n)
{
n = Math.Abs(n);
int sum = 0;
while (n > 0)
{
sum += n % 10;
n /= 10;
}
return sum;
}
// অথবা LINQ
static int SumOfDigitsLinq(int n) => Math.Abs(n).ToString().Sum(c => c - '0');
ডিজিটাল রুট (Digital Root) - একক ডিজিট পাওয়া পর্যন্ত
static int DigitalRoot(int n)
{
n = Math.Abs(n);
if (n == 0) return 0;
// ম্যাথematical ফর্মুলা: 1 + (n - 1) % 9
return 1 + (n - 1) % 9;
}
// রিকার্সিভ ভার্সন
static int DigitalRootRecursive(int n)
{
n = Math.Abs(n);
if (n < 10) return n;
return DigitalRootRecursive(SumOfDigits(n));
}
বড় সংখ্যা (BigInteger) এর জন্য
using System.Numerics;
static int SumOfDigitsBig(BigInteger n)
{
int sum = 0;
n = BigInteger.Abs(n);
while (n > 0)
{
sum += (int)(n % 10);
n /= 10;
}
return sum;
}
পারফরম্যান্স তুলনা (১০⁹ সংখ্যা)
| পদ্ধতি | টাইম কমপ্লেক্সিটি | স্ট্যাক স্পেস | নোট |
|---|---|---|---|
| রিকার্শন | O(d) (d = ডিজিট সংখ্যা) | O(d) | স্ট্যাক ওভারফ্লো রিস্ক (d > ~10000) |
| ইটেরেটিভ | O(d) | O(1) | সর্বোত্তম সাধারণ ব্যবহার |
| LINQ ToString | O(d) + аллокация | O(d) | পঠনীয়, ধীর |
| Digital Root Formula | O(1) | O(1) | শুধু ফাইনাল রুটের জন্য |
ট্রেইলিং রিকার্শন অপ্টিমাইজেশন (Tail Recursion)
C# কম্পাইলার সাধারণত টেইল কল অপ্টিমাইজেশন করে না। কিন্তু অ্যাকুমুলেটর প্যাটার্ন ব্যবহার করলে:
static int SumOfDigitsTailRec(int n, int acc = 0)
{
n = Math.Abs(n);
if (n == 0) return acc;
return SumOfDigitsTailRec(n / 10, acc + n % 10);
}
// নোট: C# JIT এটি অপ্টিমাইজ করে না, স্ট্যাক ওভারফ্লো রিস্ক রয়েছে
সারসংক্ষেপ
- বেসিক রিকার্শন: `n == 0 ? 0 : n%10 + Sum(n/10)` - শিক্ষামূলক
- প্রোডাকশন: ইটেরেটিভ `while` লুপ - দ্রুত, স্ট্যাক-সেফ
- নেগেটিভ হ্যান্ডল: `Math.Abs(n)` ব্যবহার করুন
- Digital Root: ম্যাথematical ফর্মুলা `1 + (n-1)%9` সবচেয়ে দ্রুত
- BigInteger: বড় সংখ্যার জন্য `System.Numerics.BigInteger`