محاسبه فاکتوریل در جاوا – به زبان ساده
اگر یک عدد صحیح غیر منفی n وجود داشته باشد، فاکتوریل آن عدد به صورت حاصلضرب همه اعداد صحیح مثبت کمتر یا برابر با آن تعریف میشود. در این مقاله به بررسی روشهای مختلف محاسبه فاکتوریل یک عدد مفروض در زبان برنامهنویسی جاوا میپردازیم.
محاسبه فاکتوریل برای اعداد تا 20
در این بخش با روشهای متفاوتی اقدام به محاسبه فاکتوریل اعداد تا 20 میکنیم.
استفاده از حلقه for
در ادامه یک الگوریتم ساده فاکتوریل را با استفاده از حلقه for مشاهده میکنید:
راهحل فوق برای اعداد تا 20 به خوبی کار میکند. اما اگر تلاش کنیم فاکتوریل اعداد بالاتر از 20 را محاسبه کنیم، ناموفق خواهد بود، زیرا نتایج آن قدر بزرگ خواهد شد که در یک متغیر از نوع long جای نمیگیرد و موجب خطای «سرریز» (overflow) میشود.
در ادامه با روشهای دیگر محاسبه فاکتوریل در جاوا آشنا میشویم و باید توجه داشته باشیم که این روشها تنها برای اعداد کوچک پاسخگو هستند.
استفاده از Stream در جاوا 8
امکان استفاده از API مربوط به Stream در جاوا 8 برای محاسبه فاکتوریل به روشی آسان وجود دارد:
در این برنامه ابتدا از LongStream برای تعریف حلقهای روی اعداد بین 1 تا n استفاده میکنیم. سپس از ()reduce استفاده میکنیم که از یک مقدار شناسایی و تابع تجمیع در مرحله کاهش استفاده میکند.
استفاده از بازگشت (Recursion)
در این بخش مثالی از یک برنامه محاسبه فاکتوریل میبینیم که این بار از روشهای بازگشتی استفاده شده است:
استفاده از کلاس Apache Commons Math
Apache Commons Math یک کلاس به نام CombinatoricsUtils دارد که شامل یک متد فاکتوریل استاتیک است. ما میتوانیم از این متد نیز برای محاسبه فاکتوریل استفاده کنیم.
برای incude کردن Apache Commons Math باید وابستگی commons-math3 را به pom اضافه کنیم:
در ادامه مثالی از استفاده از کلاس CombinatoricsUtils را میبینید:
توجه داشته باشید که نوع بازگشتی مانند راهحلهای بومی جاوا long است.
این بدان معنی است که اگر مقدار محاسبه شده از Long.MAX_VALUE تجاوز کند، خطای MathArithmeticException صادر میشود. برای دریافت مقادیر بزرگتر باید از نوع بازگشتی متفاوتی استفاده کنیم.
محاسبه فاکتوریل برای اعداد بزرگتر از 20
در این بخش روشهایی را بررسی میکنیم که با آنها میتوان فاکتوریل اعداد بزرگتر از 20 را نیز محاسبه کرد.
استفاده از BigInteger
چنان که پیشتر اشاره کردیم، نوع داده long برای محاسبه فاکتوریل عدد n به شرط کمتر از 20 بودن مناسب است. برای مقادیر n بزرگتر میتوانیم از کلاس BigInteger در پکیج java.math استفاده کنیم که میتواند مقادیری تا 2^Integer.MAX_VALUE را نگهداری کند.
استفاده از Guava
کتابخانه Guava گوگل یک متد کاربردی برای محاسبه فاکتوریل اعداد بزرگ ارائه کرده است. برای include کردن این کتابخانه میتوانیم وابستگی guava را به pom اضافه کنیم:
اکنون میتوانیم از متد فاکتوریل استاتیک از کلاس BigIntegerMath برای محاسبه فاکتوریل عدد مفروض استفاده کنیم:
سخن پایانی
در این مقاله، با چند روش محاسبه فاکتوریل با استفاده از توابع هسته مرکزی جاوا و همچنین چند کتابخانه دیگر آشنا شدیم. ابتدا راهحلهایی را با استفاده از نوع داده long برای محاسبه فاکتوریل تا 20 محاسبه کردیم. سپس چند روش برای محاسبه فاکتوریل اعداد بزرگتر از 20 با استفاده از BigInteger را بررسی کردیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزش های جاوا (Java)
- مجموعه آموزشهای جاوا (Java)
- 1۰ مفهوم اصلی زبان جاوا که هر فرد مبتدی باید بداند
- زبان برنامهنویسی جاوا (Java) — از صفر تا صد
==