جاوا, حل مسائل با جاوا, ساختمان داده در جاوا

فاکتوریل در جاوا (Factorial In Java)

فاکتوریل در جاوا

در این جلسه، تیم کدگیت را با آموزش فاکتوریل در جاوا همراهی کنید. پیش نیاز این آموزش کار با حلقه ها و الگوریتم های بازگشتی است.

فاکتوریل

فرض کنید n  یک عدد طبیعی باشد. عدد  !n )  n فاکتوریل) به صورت زیر تعریف می‌شود:

n!=n×(n−1)×(n−2)×…×1

برای مثال:

5!=5×4×3×2×1=120

برای  n=0 نیز این نماد تعریف می‌شود و به طور قراردادی، 0!=1 در نظر گرفته می‌شود. این قرارداد شاید در ابتدا عجیب و بیهوده به نظر بیاید، اما انگیزه‌های بسیاری برای تعریف آن وجود دارد که می‌توانید در یک پله بالاتر ببینید.

نماد فاکتوریل تنها به اعداد صحیح نامنفی محدود نمی‌شود و برای دیگر اعداد حقیقی و حتی اعداد غیر حقیقی تعریف می‌شود که می‌توانید در یک پله بالاتر با آن‌ها آشنا شوید.

پیاده سازی فاکتوریل در جاوا

برای پیاده سازی فاکتوریل میتوان از دو روش استفاده کرد.

  1. روش بازگشتی
  2. روش استفاده از حلقه

ما در این قسمت هر دوی این روش ها را آموزش میدهیم.

     public static long recursivefactorial(int n) {
          if (n == 0)
              return 1;
          else
              return n * recursivefactorial(n - 1);
     }

در بالا کد فاکتوریل در جاوا به صورت بازگشتی نوشته شده است و در آن یک ورودی میگیریم. ورودی ما مقدار فاکتوریلی است که میخواهیم محاسبه کنیم. شرط پایه در کد بازگشتی بالا موقعی است که ورودی ما برابر 0 شود و در غیر این صورت به صورت بازگشتی فاکتوریل را محاسبه میکنیم.

     public static long loopfactorial(int n) {
          long result = 1;

          while (n>0) {
              result *= n;
              n--;
          }
          return result;
     }

کد بالا روش غیر بازگشتی محاسبه فاکتوریل است. ما یک ورودی داریم مثل قبل و یک متغیر result که نتیجه را در آن میریزیم.

مشکل کدهای بالا

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

8764578968847253504

در صورتی که عددی که باید به عنوان خروجی بگیریم عدد زیر است:

265252859812191058636308480000000

علت این مشکل این است که ما وقتی از متغیر long استفاده میکنیم میتوانیم فقط بین محدوده که برای آن تعریف شده نتایج را محاسبه کنیم و اگر نتیجه از محدوده خارج شد مشکل بالا پیش می آید و جواب غلط بدست می آوریم.

راه حل

یکی از راه حل ها برای محاسبه کامل و بدون مشکل فاکتوریل استفاده از کلاس BigDecimal است که در کتابخانه  java.Math وجود دارد.این کلاس به اجازه میدهد بدون محدودیت نتایج خود را بدست بیاوریم و به مشکل برنخوریم!!

     public static BigDecimal Bigfactorial(int n) {
          if (n == 0)
              return new BigDecimal(1);
          else
              return  Bigfactorial(n - 1).multiply(new BigDecimal(n));
     }

در بالا کد بازگشتی را به صورت bigdecimal زدیم و نتیجه فاکتوریل 30 به صورت زیر به ما خروجی میدهد.

265252859812191058636308480000000

این جواب کاملا درست است!!!

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

برای تست کد های بالا main زیر را بنویسید.

   public static void main(String[] args) {
          long recursivefactorial = recursivefactorial(20);
          System.out.println(recursivefactorial);

          long loopfactorial = loopfactorial(20);
          System.out.println(loopfactorial);

          BigDecimal bigfactorial = Bigfactorial(30);
          System.out.println(bigfactorial);

     }

خروجی کد بالا

2432902008176640000
2432902008176640000
265252859812191058636308480000000

نوشته های مشابه

دیدگاهتان را بنویسید

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