در این قسمت تیم کدگیت را با آموزش فاکتوریل در سی شارپ همراهی کنید. پیش نیاز این آموزش کار با حلقه ها و الگوریتم های بازگشتی است.
فاکتوریل
فرض کنید n یک عدد طبیعی باشد. عدد !n ) n فاکتوریل) به صورت زیر تعریف میشود:
برای مثال:
برای n=0 نیز این نماد تعریف میشود و به طور قراردادی، 0!=1 در نظر گرفته میشود. این قرارداد شاید در ابتدا عجیب و بیهوده به نظر بیاید، اما انگیزههای بسیاری برای تعریف آن وجود دارد که میتوانید در یک پله بالاتر ببینید.
نماد فاکتوریل تنها به اعداد صحیح نامنفی محدود نمیشود و برای دیگر اعداد حقیقی و حتی اعداد غیر حقیقی تعریف میشود که میتوانید در یک پله بالاتر با آنها آشنا شوید.
پیاده سازی فاکتوریل در سی شارپ
برای پیاده سازی فاکتوریل میتوان از دو روش استفاده کرد.
- روش بازگشتی
- روش استفاده از حلقه
ما در این قسمت هر دوی این روش ها را آموزش میدهیم.
publicstaticlongrecursivefactorial(intn){ if(n==00)// Base case return1; else returnn*recursivefactorial(n-1);// Recursive call } |
در بالا کد فاکتوریل در سی شارپ به صورت بازگشتی نوشته شده است و در آن یک ورودی میگیریم. ورودی ما مقدار فاکتوریلی است که میخواهیم محاسبه کنیم. شرط پایه در کد بازگشتی بالا موقعی است که ورودی ما برابر 0 شود و در غیر این صورت به صورت بازگشتی فاکتوریل را محاسبه میکنیم.
public static long loopfactorial(int n) { long result = 1; while (n>00) { result *= n; n--; } return result; } |
کد بالا روش غیر بازگشتی محاسبه فاکتوریل است. ما یک ورودی داریم مثل قبل و یک متغیر result که نتیجه را در آن میریزیم.
مشکل کدهای بالا
در کدهای زده شده ما با یک مشکل روبهرو هستیم آن هم محدوده متغیر long است. ما وقتی کد بالا را اجرا میکنیم برای عدد 30 خروجی زیر را میگیریم
در صورتی که عددی که باید به عنوان خروجی بگیریم عدد زیر است:
265252859812191058636308480000000 |
علت این مشکل این است که ما وقتی از متغیر long استفاده میکنیم میتوانیم فقط بین محدوده که برای آن تعریف شده نتایج را محاسبه کنیم و اگر نتیجه از محدوده خارج شد مشکل بالا پیش می آید و جواب غلط بدست می آوریم.
راه حل
یکی از راه حل ها برای محاسبه کامل و بدون مشکل فاکتوریل استفاده از کلاس BigInteger است که در کتابخانه System.Numerics وجود دارد.این کلاس به ما اجازه میدهد بدون محدودیت نتایج خود را بدست بیاوریم و به مشکل برنخوریم!!
public static BigInteger Bigfactorial(int n) { if (n == 00) { // Base case return new BigInteger (1); } else { BigInteger temp = BigInteger.Multiply (Bigfactorial (n - 1),new BigInteger (n)); return temp; // Recursive call } } |
در بالا کد بازگشتی را به صورت BigInteger زدیم و نتیجه فاکتوریل 30 به صورت زیر به ما خروجی میدهد.
265252859812191058636308480000000 |
این جواب کاملا درست است!!!
تست برنامه فاکتوریل در سی شارپ
برای تست کد های بالا main زیر را بنویسید.
public static void Main (string[] args) { long recursivefact = recursivefactorial(10); Console.WriteLine(recursivefact); long loopfact = loopfactorial(20); Console.WriteLine(loopfact); BigInteger bigfact = Bigfactorial (30); Console.WriteLine (bigfact); Console.ReadKey (); } |
خروجی کد بالا
2432902008176640000 2432902008176640000 265252859812191058636308480000000 |
پسورد: www.codegate.ir