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

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

রিকার্শন দিয়ে গুণফল (Multiplication) কী?

গুণফল বের করা হলো যোগফলের পুনরাবৃত্তি। a × b মানে a কে b বার যোগ করা। রিকার্শনে এটি বাস্তবায়ন করা যায়: multiply(a, b) = a + multiply(a, b-1), বেস কেস: multiply(a, 0) = 0।

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

ইনপুট:

Enter two number : 12 and 9

আউটপুট:

The product of 12 and 9 is 108

অ্যালগরিদম

  1. প্রোগ্রাম শুরু করুন
  2. দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_input_1, my_input_2
  3. ব্যবহারকারী থেকে দুটি সংখ্যা ইনপুট নিন
  4. রিকার্সিভ ফাংশন getproduct(a, b) ডিফাইন করুন:
    • যদি a < b হয়, আর্গুমেন্ট স왪 করুন (অপ্টিমাইজেশন: ছোট সংখ্যা বার বার যোগ করলে দ্রুত)
    • যদি b != 0 হয়, a + getproduct(a, b-1) রিটার্ন করুন
    • অন্যথায় (b == 0) 0 রিটার্ন করুন
  5. ফাংশন কল করুন এবং ফলাফল প্রিন্ট করুন
  6. প্রোগ্রাম শেষ করুন

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

import java.util.Scanner;

public class ProductRecursion {
    public static void main(String[] args) {
        int my_input_1, my_input_2;
        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_1 = my_scanner.nextInt();
        System.out.print("Enter the number : ");
        my_input_2 = my_scanner.nextInt();
        
        System.out.println("The product of " + my_input_1 + " and " + my_input_2 + 
                          " is " + getproduct(my_input_1, my_input_2));
    }
    
    static int getproduct(int my_input_1, int my_input_2) {
        if (my_input_1 < my_input_2)
            return getproduct(my_input_2, my_input_1);
        else if (my_input_2 != 0)
            return (my_input_1 + getproduct(my_input_1, my_input_2 - 1));
        else
            return 0;
    }
}

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

public class ProductRecursion {
    public static void main(String[] args) {
        int my_input_1 = 12;
        int my_input_2 = 9;
        System.out.println("The two numbers are defined as " + my_input_1 + " and " + my_input_2);
        System.out.println("The product of " + my_input_1 + " and " + my_input_2 + 
                          " is " + getproduct(my_input_1, my_input_2));
    }
    
    static int getproduct(int my_input_1, int my_input_2) {
        if (my_input_1 < my_input_2)
            return getproduct(my_input_2, my_input_1);
        else if (my_input_2 != 0)
            return (my_input_1 + getproduct(my_input_1, my_input_2 - 1));
        else
            return 0;
    }
}

রিকার্শন ট্রেস (12 × 9)

অপ্টিমাইজেশন: 12 < 9 মিথ্যা, তাই স্ব্যাপ হয়না। 9 বার 12 যোগ হবে।

getproduct(12, 9)
= 12 + getproduct(12, 8)
= 12 + 12 + getproduct(12, 7)
= 12 + 12 + 12 + getproduct(12, 6)
= 12 + 12 + 12 + 12 + getproduct(12, 5)
= 12 + 12 + 12 + 12 + 12 + getproduct(12, 4)
= 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 3)
= 12 + 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 2)
= 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 1)
= 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + getproduct(12, 0)
= 12 × 9 + 0
= 108

কোড ব্যাখ্যা

  • স್ವ্যাপ অপ্টিমাইজেশন: if (a < b) swap → কম ইটারেশনে বড় সংখ্যা যোগ হয়
  • বেস কেস: b == 0 হলে 0 রিটার্ন (গুণনীয় অভিজ্ঞতা)
  • রিকার্সিভ কেস: a + getproduct(a, b-1) → a কে b বার যোগ করা

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

static int getproduct(int a, int b) {
    // বেস কেস
    if (b == 0) return 0;
    
    // 네가েটিভ হ্যান্ডলিং
    if (b < 0) return -getproduct(a, -b);
    
    // পজিটিভ b এর জন্য
    return a + getproduct(a, b - 1);
}

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

public static int multiply(int a, int b) {
    int result = 0;
    boolean negative = (a < 0) ^ (b < 0); // XOR
    a = Math.abs(a);
    b = Math.abs(b);
    
    // অপ্টিমাইজেশন: ছোটটি লুপ কাউন্টার বানান
    if (a < b) { int temp = a; a = b; b = temp; }
    
    for (int i = 0; i < b; i++) {
        result += a;
    }
    return negative ? -result : result;
}

রাশিয়ান পেজ্যান্ট মাল্টিপ্লিকেশন (O(log n))

public static int russianPeasant(int a, int b) {
    int result = 0;
    while (b > 0) {
        if ((b & 1) != 0) result += a; // b বিজোড় হলে a যোগ করুন
        a <<= 1; // a = a * 2
        b >>= 1; // b = b / 2
    }
    return result;
}

সতর্কতা

  • রিকার্শন দিয়ে গুণফল শুধু শেখার উদ্দেশ্যে - প্রোডাকশনে ব্যবহার করবেন না
  • বড় সংখ্যার জন্য StackOverflowError হবে
  • Integer overflow হ্যান্ডলিং দরকার (long বা BigInteger ব্যবহার করুন)
  1. জাভা প্রোগ্রাম: বৃত্তের পরিধি (Perimeter) বের করার পদ্ধতি

  2. জাভা প্রোগ্রাম: ট্রাপিজিয়াম (Trapezium) এর ক্ষেত্রফল বের করার পদ্ধতি

  3. জাভা প্রোগ্রাম: বৃত্তের ক্ষেত্রফল নির্ণয়

  4. জাভা প্রোগ্রাম: আয়তের পরিসীমা নির্ণয়