به تابعی بازگشتی می گوییم که در روند اجرا خودش را فراخوانی کند . شاید به نظر برسد که در چنین حالتی برنامه هیچوقت به پابان نمیرسد ولی همیشه اینطور نیست اگر تابع ما شرایط خاصی داشته باشد و حالت پایه برای آن تعریف شده باشد روند اجرای آن به پایان میرسد و نتیجه مورد نظر بدست می آید.
میخواهیم تابعی بازگشتی برای محاسبه تابع F(n)=n! بنویسیم.
int fac(int n){ if(n<=0) return 1; return n*fac(n-1); }
حال روند محاسبه fac(3) را بررسی میکنیم . fac(3) صدا میشود و سپس fac(2) را صدا میکند و سپس fac(1) صدا میشود و خروجی 1 را برمیگرداند در تابع fac(2) این مقدار در 2 ضرب شده و مقدار 2 به عنوان خروجی fac(2) به تابع fac(3) فرستاده میشود و این مقدار در 3 ضرب میشود و مقدار 6 به عنوان خروجی برگردانده میشود.
میخواهیم تابعی بنویسیم که مقدار جمله n ام فیبوناچی را محاسبه کند.
int fibo(int n){ if(n<=1) return 1; return fibo(n-1)+fibo(n-2); }
روند محاسبه fibo(5) به این شکل است :
تابعی بازگشتی بنویسید که مقدار p mod nk را در O(lgk) محاسبه کند.
پاسخ
int modPow(int n,int k,int p){ if(k==0) return n%p; int ret=modPow(n,k/2,p); ret=(temp*temp)%p; if(k%2==1) temp=(temp*n)%p; return temp; }