অঙ্কের যোগফল (Sum of Digits) রিকার্শনে
একটি সংখ্যার সব অঙ্কের যোগফল বের করার জন্য রিকার্শন ব্যবহার করা যায়। প্রতিটি কল থেকে শেষ অঙ্ক (n % 10) নিয়ে বাকি অংশ (n / 10) রিকার্সিভলি প্রসেস করা হয়।
ইনপুট ও আউটপুট উদাহরণ
ইনপুট:
Enter the number : 12131415
আউটপুট:
The Sum of digits of 12131415 is 18
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_input, my_result
- ব্যবহারকারী থেকে সংখ্যা ইনপুট নিন
- রিকার্সিভ ফাংশন digitSum(n) ডিফাইন করুন:
- বেস কেস: যদি n == 0 হয়, 0 রিটার্ন করুন
- রিকার্সিভ কেস: (n % 10) + digitSum(n / 10) রিটার্ন করুন
- digitSum(my_input) কল করুন এবং ফলাফল স্টোর করুন
- ফলাফল প্রদর্শন করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া
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 API | O(log n) | O(log n) | পাঠযোগ্য, মডার্ন |
| গাণিতিক (Digital Root) | O(1) | O(1) | সবচেয়ে দ্রুত |
বাস্তব প্রয়োগ
- চেক ডিজিট ভ্যালিডেশন (ISBN, ক্রেডিট কার্ড - Luhn অ্যালগরিদম)
- নামারোলজি, গেমিং
- হ্যাশ ফাংশন, চেকসাম