প্রাকৃতিক সংখ্যা (Natural Numbers) ও তাদের যোগফল
প্রাকৃতিক সংখ্যা হলো ১ থেকে শুরু হওয়া ধনাত্মক পূর্ণসংখ্যাগুলো (১, ২, ৩, ৪, ...)। প্রথম nটি প্রাকৃতিক সংখ্যার যোগফল বের করার সূত্র: S(n) = n(n+1)/2।
রিকার্শনে: sum(n) = n + sum(n-1), বেস কেস: sum(0) = 0
ইনপুট ও আউটপুট উদাহরণ
ইনপুট:
Enter the number : 25
আউটপুট:
The sum of natural numbers up to 25 is 325
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_input, my_sum
- ব্যবহারকারী থেকে সংখ্যা ইনপুট নিন
- রিকার্সিভ ফাংশন Add(n) ডিফাইন করুন:
- বেস কেস: যদি n <= 0 হয়, 0 রিটার্ন করুন
- রিকার্সিভ কেস: n + Add(n - 1) রিটার্ন করুন
- Add(my_input) কল করুন এবং ফলাফল স্টোর করুন
- ফলাফল প্রদর্শন করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া
import java.util.Scanner;
public class NaturalNumbers {
public static void main(String[] args) {
int my_input, my_sum;
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();
System.out.println("The number is defined as " + my_input);
my_sum = Add(my_input);
System.out.println("The sum of natural numbers up to " + my_input + " is " + my_sum);
}
public static int Add(int my_input) {
if (my_input > 0)
return my_input + Add(my_input - 1);
else
return my_input; // 0 বা 네가েটিভ হলে 0
}
}
উদাহরণ ২: পূর্বনির্ধারিত মান ব্যবহার
public class NaturalNumbers {
public static void main(String[] args) {
int my_input = 25, my_sum;
System.out.println("The number is defined as " + my_input);
my_sum = Add(my_input);
System.out.println("The sum of natural numbers up to " + my_input + " is " + my_sum);
}
public static int Add(int my_input) {
if (my_input > 0)
return my_input + Add(my_input - 1);
else
return my_input;
}
}
রিকার্শন ট্রেস (Add(5))
Add(5) = 5 + Add(4) = 5 + (4 + Add(3)) = 5 + 4 + (3 + Add(2)) = 5 + 4 + 3 + (2 + Add(1)) = 5 + 4 + 3 + 2 + (1 + Add(0)) = 5 + 4 + 3 + 2 + 1 + 0 = 15
গাণিতিক সূত্র (O(1) সমাধান - সেরা পদ্ধতি)
public static int sumFormula(int n) {
if (n <= 0) return 0;
return n * (n + 1) / 2; // গাউসের সূত্র
}
// লং রিটার্ন (ওভারফ্লো এড়াতে)
public static long sumFormulaLong(int n) {
return (long) n * (n + 1) / 2;
}
তুলনা: রিকার্শন vs সূত্র vs লুপ
| পদ্ধতি | সময় জটিলতা | স্পেস জটিলতা | নোট |
|---|---|---|---|
| রিকার্শন | O(n) | O(n) | স্ট্যাক ওভারফ্লো রিস্ক (n > 10000) |
| ফর লুপ | O(n) | O(1) | সিম্পল, নিরাপদ |
| গাণিতিক সূত্র | O(1) | O(1) | সবচেয়ে দ্রুত, প্রোডাকশন রেডি |
| Stream API | O(n) | O(1) | IntStream.rangeClosed(1, n).sum() |
Java 8+ Stream API
// প্যারালেল স্ট্রিম (বড় n-এ দ্রুত)
long sum = LongStream.rangeClosed(1, n).parallel().sum();
// বক্সড ইন্টিজার
int sum = IntStream.rangeClosed(1, n).sum();
নেগেটিভ ইনপুট হ্যান্ডলিং
public static int sumNatural(int n) {
if (n <= 0) return 0;
// আপনার পছন্দের পদ্ধতি
return n * (n + 1) / 2;
}
সम्बद्ध সমস্যা: জোড়/বিজোড় প্রাকৃতিক সংখ্যার যোগফল
// প্রথম nটি জোড় সংখ্যার যোগফল: n(n+1)
public static int sumEven(int n) { return n * (n + 1); }
// প্রথম nটি বিজোড় সংখ্যার যোগফল: n²
public static int sumOdd(int n) { return n * n; }
// ১ থেকে n পর্যন্ত জোড় সংখ্যার যোগফল
public static int sumEvenUpto(int n) {
int k = n / 2;
return k * (k + 1);
}
// ১ থেকে n পর্যন্ত বিজোড় সংখ্যার যোগফল
public static int sumOddUpto(int n) {
int k = (n + 1) / 2;
return k * k;
}
বাস্তব প্রয়োগ
- সিরিজ যোগফল (Arithmetic progression)
- লুপ কমপ্লেক্সিটি অ্যানালাইসিস
- গেম স্কোর ক্যালকুলেশন
- ফাইন্যান্সিয়াল ক্যালকুলেশন (অ্যানুইটি)
সতর্কতা
- রিকার্শন শুধু শেখার জন্য - প্রোডাকশনে সূত্র বা লুপ ব্যবহার করুন
- Integer ওভারফ্লো: n ≈ 46340 এর বেশি হলে n*(n+1) ওভারফ্লো করে → long ব্যবহার করুন
- স্ট্যাক ওভারফ্লো: n > ~১০০০০ হলে (JVM সেটিংস অনুযায়ী)