محاسبه فاکتوریل در جاوا — به زبان ساده

۱۶۱۸ بازدید
آخرین به‌روزرسانی: ۰۶ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
محاسبه فاکتوریل در جاوا — به زبان ساده

اگر یک عدد صحیح غیر منفی n وجود داشته باشد، فاکتوریل آن عدد به صورت حاصلضرب همه اعداد صحیح مثبت کمتر یا برابر با آن تعریف می‌شود. در این مقاله به بررسی روش‌های مختلف محاسبه فاکتوریل یک عدد مفروض در زبان برنامه‌نویسی جاوا می‌پردازیم.

محاسبه فاکتوریل برای اعداد تا 20

در این بخش با روش‌های متفاوتی اقدام به محاسبه فاکتوریل اعداد تا 20 می‌کنیم.

استفاده از حلقه for

در ادامه یک الگوریتم ساده فاکتوریل را با استفاده از حلقه for مشاهده می‌کنید:

1public long factorialUsingForLoop(int n) {
2    long fact = 1;
3    for (int i = 2; i <= n; i++) {
4        fact = fact * i;
5    }
6    return fact;
7}

راه‌حل فوق برای اعداد تا 20 به خوبی کار می‌کند. اما اگر تلاش کنیم فاکتوریل اعداد بالاتر از 20 را محاسبه کنیم، ناموفق خواهد بود، زیرا نتایج آن قدر بزرگ خواهد شد که در یک متغیر از نوع long جای نمی‌گیرد و موجب خطای «سرریز» (overflow) می‌شود.

در ادامه با روش‌های دیگر محاسبه فاکتوریل در جاوا آشنا می‌شویم و باید توجه داشته باشیم که این روش‌ها تنها برای اعداد کوچک پاسخگو هستند.

استفاده از Stream در جاوا 8

امکان استفاده از API مربوط به Stream در جاوا 8 برای محاسبه فاکتوریل به روشی آسان وجود دارد:

1public long factorialUsingStreams(int n) {
2    return LongStream.rangeClosed(1, n)
3        .reduce(1, (long x, long y) -> x * y);
4}

در این برنامه ابتدا از LongStream برای تعریف حلقه‌ای روی اعداد بین 1 تا n استفاده می‌کنیم. سپس از ()reduce استفاده می‌کنیم که از یک مقدار شناسایی و تابع تجمیع در مرحله کاهش استفاده می‌کند.

استفاده از بازگشت (Recursion)

در این بخش مثالی از یک برنامه محاسبه فاکتوریل می‌بینیم که این بار از روش‌های بازگشتی استفاده شده است:

1public long factorialUsingRecursion(int n) {
2    if (n <= 2) {
3        return n;
4    }
5    return n * factorialUsingRecursion(n - 1);
6}

استفاده از کلاس Apache Commons Math

Apache Commons Math یک کلاس به نام CombinatoricsUtils دارد که شامل یک متد فاکتوریل استاتیک است. ما می‌توانیم از این متد نیز برای محاسبه فاکتوریل استفاده کنیم.

برای incude کردن Apache Commons Math باید وابستگی commons-math3 را به pom اضافه کنیم:

1<dependency>
2    <groupId>org.apache.commons</groupId>
3    <artifactId>commons-math3</artifactId>
4    <version>3.6.1</version>
5</dependency>

در ادامه مثالی از استفاده از کلاس CombinatoricsUtils را می‌بینید:

1public long factorialUsingApacheCommons(int n) {
2    return CombinatoricsUtils.factorial(n);
3}

توجه داشته باشید که نوع بازگشتی مانند راه‌حل‌های بومی جاوا long است.

این بدان معنی است که اگر مقدار محاسبه شده از Long.MAX_VALUE تجاوز کند، خطای MathArithmeticException صادر می‌شود. برای دریافت مقادیر بزرگ‌تر باید از نوع بازگشتی متفاوتی استفاده کنیم.

محاسبه فاکتوریل برای اعداد بزرگ‌تر از 20

در این بخش روش‌هایی را بررسی می‌کنیم که با آن‌ها می‌توان فاکتوریل اعداد بزرگ‌تر از 20 را نیز محاسبه کرد.

استفاده از BigInteger

چنان که پیش‌تر اشاره کردیم، نوع داده long برای محاسبه فاکتوریل عدد n به شرط کمتر از 20 بودن مناسب است. برای مقادیر n بزرگ‌تر می‌توانیم از کلاس BigInteger در پکیج java.math استفاده کنیم که می‌تواند مقادیری تا 2^Integer.MAX_VALUE را نگهداری کند.

1public BigInteger factorialHavingLargeResult(int n) {
2    BigInteger result = BigInteger.ONE;
3    for (int i = 2; i <= n; i++)
4        result = result.multiply(BigInteger.valueOf(i));
5    return result;
6}

استفاده از Guava

کتابخانه Guava گوگل یک متد کاربردی برای محاسبه فاکتوریل اعداد بزرگ ارائه کرده است. برای include کردن این کتابخانه می‌توانیم وابستگی guava را به pom اضافه کنیم:

1<dependency>
2    <groupId>com.google.guava</groupId>
3    <artifactId>guava</artifactId>
4    <version>25.1-jre</version>
5</dependency>

اکنون می‌توانیم از متد فاکتوریل استاتیک از کلاس BigIntegerMath برای محاسبه فاکتوریل عدد مفروض استفاده کنیم:

1public BigInteger factorialUsingGuava(int n) {
2    return BigIntegerMath.factorial(n);
3}

سخن پایانی

در این مقاله، با چند روش محاسبه فاکتوریل با استفاده از توابع هسته مرکزی جاوا و همچنین چند کتابخانه دیگر آشنا شدیم. ابتدا راه‌حل‌هایی را با استفاده از نوع داده long برای محاسبه فاکتوریل تا 20 محاسبه کردیم. سپس چند روش برای محاسبه فاکتوریل اعداد بزرگ‌تر از 20 با استفاده از BigInteger را بررسی کردیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
baeldung
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *