কম্পিউটার টিউটোরিয়াল

C#-এ রিকার্শন ব্যবহার করে সংখ্যার ডিজিট সাম বের করা

রিকার্শন ব্যবহার করে একটি সংখ্যার সব ডিজিটের যোগফল (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 ToStringO(d) + аллокацияO(d)পঠনীয়, ধীর
Digital Root FormulaO(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`
  1. পাইথনে রিকার্শন দিয়ে প্রাকৃতিক সংখ্যাগুলোর যোগফল (Sum of Natural Numbers) বের করা

  2. Python-এ একটি সংখ্যার ফ্যাক্টোরিয়াল (Factorial) বের করা

  3. Python-এ প্রাকৃতিক সংখ্যার যোগফল (Sum of Natural Numbers) বের করা

  4. Python-এ রিকার্শন ব্যবহার করে ফ্যাক্টোরিয়াল বের করা