در این قسمت از فیلم آموزش c++ تابع بازگشتی فاکتوریل را آموزش داده ایم ، اول تابع بازگشتی را تعریف می کنیم و بعد کد تابع بازگشتی فاکتوریل را در سی پلاس پلاس برای شما می نویسیم .
تابع بازگشتی ( Recursive ) :
تابع بازگشتی یعنی تابعی که خودش را فراخوانی کند ، حالا این نحوه فراخوانی به دو صورت انجام می شود : 1- مستقیم 2- غیر مستقیم در سورس کد زیر می توانید مشاهده کنید :
#include <iostream.h> #include <conio.h> void a(); int sum(); int add(); int main(){ clrscr(); a(); sum(); getch(); return 0; } void a( ){ a( ); // فراخوانی مستقیم } int sum( ){ add(); return 0; } int add( ){ sum(); return 0; }
همان طور که می بینید فراخوانی مستقیم یعنی تابع را درون خودش فراخوانی کنیم و تابع بازگشتی به صورت غیر مستقیم ، تابعی مثل ()sum تابع ()add را فراخوانی کند و تابع ()add نیز تابع ()sum را فراخوانی کند . ( توضیحات بیش تر در فیلم آموزش تابع بازگشتی داده شده است )
طرح کلی توابع بازگشتی به این صورت است که یک یا چند حالت خاصیت بازگشتی دارند و یک یا چند حالت هم در تابع بدون فراخوانی بازگشتی کار خود را انجان می دهند . به حالتی ( دستوراتی ) که بدون فراخوانی بازگشتی کار می کنند حالت توقف می گویند ، چون اگر تابع ، یک حالت توقف نداشته باشد آن تابع خاتمه نمی یابد . در توابع بازگشتی بیش تر با استفاده از دستور if مشخص می کنیم که کدام یکی از حالت ها باید اتفاق بیفتد .
محاسبه تابع بازگشتی فاکتوریل :
ما می دانیم که 4 فاکتوریل ، 3 فاکتوریل و … به صورت زیر هستند :
4! = 1*2*3*4
3! = 1*2*3
2! = 1*2
1! = 0!*1
0! = 1
برای نوشتن تابع بازگشتی فاکتوریل باید کاری کنیم تا این تابع هی خودش رو فراخوانی بکنه ، اول از مقادیر بالا می فهمیم که فاکتوریل عدد 4 به صورت زیر محاسبه می شود :
4! = 4*3!
حالا این رابطه را به بقیه فاکنوریل ها ها می شود بسط داد که رابطه آن به صورت زیر است :
n! = n * (n-1)!
این رابطه میگه که فاکتوریل عدد را فاکتوریل حالت قبلی ضرب می کنیم تا جواب به دست آید . ( اگه متوجه نشدید فیلم رو ببینید )
سورس کد تابع بازگشتی فاکتوریل :
#include <iostream.h> #include <conio.h> unsigned long fact(int a); int main(){ clrscr(); int x; cout<<"Enter Number For Fact:"; cin>>x; cout<<"\n Enter = "<<x<<"\t Fact = "<<fact(x); getch(); return 0; } unsigned long fact(int a){ if( a != 0 ) return ( a * fact(a-1) ); else return 1; }
شاید براتون شوال باشه که چرا نوع تابع را unsigned انتخاب کردیم ؟؟؟؟؟؟؟ unsigned یه معنی بدون علامت است و یعنی فقط عدد مثبت می توانیم وارد کنیم و long هم برای این است که عدد طولانی تری را برگرداند .
اگر به تابع fact نگاه کنید می بینید همان طور که در بالا گفتم تابع ما دو حالت بازگشتی و غیر بازگشتی ( حالت توقف ) را دارد . ما می دانیم که فاکتوریل عدد 0 ( صفر ) برابر یک است پس اگر عددی کاربر وارد کرده مخالف صفر بود بیا اون عدد رو در حالت قبلی ( یکی کمتر ) ضرب کن و تابع را فراخوانی کن و تابعی که فراخوانی می شود دوباره این مراحل را انجام می دهد مگر اینکه صفر شود ، وقتی صفر شد یک رو بر می گردونه که جواب !0 است و آن را در 1 ضرب می کند تا جواب فاکتوریل 1 به دست بیاید و بعد جواب به دست آمده را در عدد 2 ضرب می کند تا جواب فاکتوریل 2 به دست بیاید و این پروسه ادامه پیدا می کند تا به جواب نهایی برسیم . ( توضیحات این قسمت در انتهای فیلم آموزش تابع بازگشتی فاکتوریل داده شده است )
تابع بازگشتی بنویسید که عدد دهدهی وبه باینری تبدیل کند؟