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

জাভা প্রোগ্রাম: রিকার্শন ব্যবহার করে সংখ্যার অঙ্কগুলোর যোগফল বের করা

অঙ্কের যোগফল (Sum of Digits) রিকার্শনে

একটি সংখ্যার সব অঙ্কের যোগফল বের করার জন্য রিকার্শন ব্যবহার করা যায়। প্রতিটি কল থেকে শেষ অঙ্ক (n % 10) নিয়ে বাকি অংশ (n / 10) রিকার্সিভলি প্রসেস করা হয়।

ইনপুট ও আউটপুট উদাহরণ

ইনপুট:

Enter the number : 12131415

আউটপুট:

The Sum of digits of 12131415 is 18

অ্যালগরিদম

  1. প্রোগ্রাম শুরু করুন
  2. দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_input, my_result
  3. ব্যবহারকারী থেকে সংখ্যা ইনপুট নিন
  4. রিকার্সিভ ফাংশন digitSum(n) ডিফাইন করুন:
    • বেস কেস: যদি n == 0 হয়, 0 রিটার্ন করুন
    • রিকার্সিভ কেস: (n % 10) + digitSum(n / 10) রিটার্ন করুন
  5. digitSum(my_input) কল করুন এবং ফলাফল স্টোর করুন
  6. ফলাফল প্রদর্শন করুন
  7. প্রোগ্রাম শেষ করুন

উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া

import java.util.Scanner;

public class Sum {
    public static void main(String args[]) {
        int my_input, my_result;
        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 = my_scanner.nextInt();
        
        my_result = digitSum(my_input);
        System.out.println("The Sum of digits of " + my_input + " is " + my_result);
    }
    
    static int digitSum(int n) {
        if (n == 0)
            return 0;
        return (n % 10 + digitSum(n / 10));
    }
}

উদাহরণ ২: পূর্বনির্ধারিত মান ব্যবহার

public class Sum {
    public static void main(String args[]) {
        int my_input = 12131415;
        System.out.println("The number is defined as : " + my_input);
        int my_result = digitSum(my_input);
        System.out.println("The Sum of digits of " + my_input + " is " + my_result);
    }
    
    static int digitSum(int n) {
        if (n == 0)
            return 0;
        return (n % 10 + digitSum(n / 10));
    }
}

রিকার্শন ট্রেস (12131415)

digitSum(12131415)
= 5 + digitSum(1213141)
= 5 + 1 + digitSum(121314)
= 5 + 1 + 4 + digitSum(12131)
= 5 + 1 + 4 + 1 + digitSum(1213)
= 5 + 1 + 4 + 1 + 3 + digitSum(121)
= 5 + 1 + 4 + 1 + 3 + 1 + digitSum(12)
= 5 + 1 + 4 + 1 + 3 + 1 + 2 + digitSum(1)
= 5 + 1 + 4 + 1 + 3 + 1 + 2 + 1 + digitSum(0)
= 5 + 1 + 4 + 1 + 3 + 1 + 2 + 1 + 0
= 18

কোড ব্যাখ্যা

  • n % 10: সংখ্যার শেষ অঙ্ক বের করে
  • n / 10: সংখ্যা থেকে শেষ অঙ্ক বাদ দেয় (ইন্টিজার ডিভিশন)
  • বেস কেস n == 0: সব অঙ্ক প্রসেস হয়ে গেলে রিকার্শন বন্ধ হয়
  • টেল রিকার্শন নয়: রিটার্ন স্টেটমেন্টে যোগ অপারেশন আছে, তাই স্ট্যাক ফ্রেম রিটেইন থাকে

নেগেটিভ সংখ্যা হ্যান্ডলিং

static int digitSum(int n) {
    if (n < 0) return digitSum(-n); // নেগেটিভ হলে পজিটিভ করুন
    if (n == 0) return 0;
    return (n % 10 + digitSum(n / 10));
}

ইটারেটিভ সমাধান (প্রোডাকশন রেডি)

public static int digitSumIterative(int n) {
    int sum = 0;
    n = Math.abs(n); // 네가েটিভ হ্যান্ডলিং
    while (n != 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

// Java 8 Stream (স্ট্রিং কনভার্সন)
public static int digitSumStream(int n) {
    return String.valueOf(Math.abs(n))
        .chars()
        .map(c -> c - '0')
        .sum();
}

ডিজিটাল রুট (Digital Root) - যোগফলের যোগফল

যোগফল একক অঙ্ক হয় পর্যন্ত যোগ করা:

public static int digitalRoot(int n) {
    if (n == 0) return 0;
    return 1 + (n - 1) % 9; // গাণিতিক সূত্র (O(1))
}

তুলনা

পদ্ধতিসময়স্পেসবিশেষতা
রিকার্শনO(log n)O(log n)শেখার জন্য ভালো
ইটারেটিভO(log n)O(1)প্রোডাকশনের জন্য সেরা
Stream APIO(log n)O(log n)পাঠযোগ্য, মডার্ন
গাণিতিক (Digital Root)O(1)O(1)সবচেয়ে দ্রুত

বাস্তব প্রয়োগ

  • চেক ডিজিট ভ্যালিডেশন (ISBN, ক্রেডিট কার্ড - Luhn অ্যালগরিদম)
  • নামারোলজি, গেমিং
  • হ্যাশ ফাংশন, চেকসাম
  1. একটি সংখ্যার ফ্যাক্টরগুলির ন্যূনতম যোগফল বের করার জাভা প্রোগ্রাম

  2. পাইথনে বেস K-এ রূপান্তরিত সংখ্যার ডিজিট সম গণনা

  3. পাইথন প্রোগ্রাম: রিকার্শন ছাড়া সংখ্যার অঙ্কগুলোর যোগফল বের করা

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