برنامه محاسبه فاکتوریل با پایتون

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


مقدمه

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

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

دیگه حرف زدن بسه ! بریم سراغ نوشتن برنامه ??


توابع بازگشتی چی هستند ؟

توابع بازگشتی یکسری توابع هستند که موقعی که تعریف می شوند توی خودشون صدا زده می شوند یا به عبارت می دیگر هنگام تعریف تابع از خود اون تابع استفاده می شود.

مثلا تابع x داریم ، ما وقتی داریم این تابع رو تعریف می کنیم ()x استفاده می کنیم.

حالا توی مثال کامل متوجه می شوید.


فاکتوریل چی هست ؟

الان تابستان هست ؛ تازه از ریاضی راحت شدم :) دوست ندارم با تعاریف ریاضی خودم و شما را خسته کنم اما در کل وقتی می خواهیم فاکتوریل عدد 5 رو پیدا کنیم باید 5 رو ضرب در 4 و ضرب در 3 و 2 و 1 می کنیم یعنی عدد مورد نظرمون رو ضرب در اعداد متوالی 1 تا اون عدد می کنیم.

مثلا می خواهیم فاکتوریل 3 رو بدست بیاوریم عبارت : ( 3 * 2 * 1 ) را بدست بیاوریم که حاصل 6 می شود. ( خوبه بدونید که علامت فاکتوریل در ریاضی "!" هست )

فاکتوریل اعداد 1 , 2 , 3 , 4 , 5
فاکتوریل اعداد 1 , 2 , 3 , 4 , 5


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

برای شروع یک تابع تعریف می کنیم من اسم این تابع رو می زارم Functorial_Calc این تابع باید یک متغیر رو به عنوان آرگمان دریافت کند که اسم اونم من number می زارم.

خوب بعدش یک متغیر می سازیم و مقدار 1 رو توش قرار می دهیم تا با حقله For بتوانیم به این مقدار اعداد متوالی 1 تا اون عدد را درش ضرب کنیم من اسمش رو می زارم result.

در مرحله بعد ، یک حلقه for می سازیم متغیری را به عنوان شمارنده قرار می دهیم من اسمش را i می زارم حالا باید اعداد متوالی رنج 1 تا یک دانه بیشتر از عدد را توی for قرار بدهیم..

def Functorial_Calc(number):

result = 1

for i in range(1, number + 1):

تا اینجا برنامه ، ما یک عدد می دهیم مثلا وقتی 5 را می به عنوان نامبر می دهیم حالا رنج 1 تا 6 ( یعنی 1 و 2 و3و4و5) را بر می گرداند حالا اول 1 توی i قرار می دهد یک بار for را اجرا می کند بعد 2 را توی i قرار می دهد یک بار دیگر for را اجرا می کند و همینطور تا ادامه ...

حالا کد result = result * i توی for قرار می دهیم تا هر بار عدد i با مقدار قبلی result ضرب می شود مثلا الان i یک هست result هم مقدارش یک هست 1 * 1 می شود یک result می شود یک.

بعد 2 توی i قرار می گیرد و با مقدار قبلی result که یک بود ضرب می شود 2 توی ریزالت قرار می گیرد به همین راحتی این حلقه ادامه دارد تا result مقدار فاکتوریل بشود.

در مرحله آخر کافیه مقدار result را برگردانیم این کار را حتما باید توی ایندنت خود تابع قرار بدهیم نه for وگرنه هر بار result رو بر می گرداند...

نمای کلی از تابع
نمای کلی از تابع

باید قبول کنیم درک این برنامه بدون دانش حداقلی از پایتون سخت است :(


نوشتن برنامه با توابع بازگشتی

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

اینجا مثل مثال قبلی یک تابع داریم (اسمش رو هر چی دوست داریم می زاریم) و یک عدد را در آرگمان تابع دریافت می کنیم باید بدانید وقتی وقتی عدد ما یک باشد قاعدتا فاکتوریل آن هم یک هست پس یک شرط تعریف می کنیم که اگر عددمون یک بود برای مقدار فاکتوریل یک را برگردان.

یک elif قرار می دهیم می گیم در غیر اینصورت اگر عدد ما یک نبود هر چیزی جز یک بود :

return (num * Functorila_second(num - 1))

اصل برنامه این خط کد بالا هست. توی این کد در واقع گفته می شود مقدار عددمون رو در فاکتوریل یکی کمترش ضرب کن. خوب دقت کنید می خواهیم فاکتوریل 5 را بدست بیاوریم ، فاکتوریل چهار (یکی کمتر از یک عدد اصلی ) چیه ؟ (4 * 3 * 2 *1 ) : 24 حالا 24 را در عدد اصلی که 5 باشد ضرب می کنیم می شود : 120

فاکتوریل عدد : عدد * فاکتوریل ( عدد - 1 )

جمله بالا در واقع معنی اون خط کد ما هست ما از اسم تابع استفاده می کنیم تا فاکتوریل یکی کمتر از عدد اصلی را بدست بیاوریم و برگردونیمش ?

به همین سادگی....


پایان

دوستان قبول دارم شاید یکم پیچیده باشد مخصوصا برنامه با توابع بازگشتی اما اگر همین برنامه رو روی کاغذ بنویسید و سعی کنید عملکردش رو برای خودتون شرح بدید کاملا درک می کنید...

امیدورام این پست براتون مفید واقع شده باشد??

اگر سوالی بود خوشحال می شود بتوانم توی کامنتا بهتون جواب بدم.

موفق باشی...