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

کدی به زبان C++ با استفاده از تابع بازگشتی بنویسید که حاصلضرب دو عدد را با استفاده از حاصلجمع آنها بدست آورد .(برای حل این مثال لازم است بدانید که :)

            a*b=a          ----->     اگر b=1
            a*b=a*(b-1)+a  ----->     اگر b>1                              

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
#include <iostream.h>
#include <conio.h>

int product(int, int);      

int main()
{
    int a, b;

    cout << "Enter first number :" ;
    cin >> a;
    cout << "Enter second number :" ;
    cin >> b;
            
    cout << product(a, b);

    getch();
    return 0;
}

int product(int a, int b)       
{
    if(b == 1)
        return a;
    return (a + product(a, b-1));
}

 //////////////////////توضیح\\\\\\\\\\\\\\\\\\\\

/* a=4, b=3

1) if(3==1)
 return 4;
return(4+product(4,3-1))

2) if(2==1)
 return 4;
return(4+product(4,2-1))

3) if(1==1)
 return 4;
return(4+product(4,1-1)) */
Enter first number :4
Enter second number :3
12

در فراخوانی سوم از تابع بازگشتی بالا، شرط درست است پس مقدار 4 به فراخوانی دوم بر میگردد و باز با مقدار 4 فراخوانی دوم جمع شده و عدد حاصل که 8 است به فراخوانی اول بر میگردد و باز با 4 جمع شده و در نهایت مقدار 12 که جواب ماست چاپ می شود. حتما توجه کنید که از فراخوانی سوم به بعد شرط if نقض شده و فراخوانی تابع بازگشتی متوقف می شود .

در مورد توابع بازگشتی باید چندین نکته را رعایت کنید :

الف) غیر از اینکه تابع بازگشتی را در تابع main فراخوانی می کنیم باید در درون تعریف خود تابع بازگشتی هم آنرا فراخوانی کنیم.

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

پ) در فراخوانی تابع بازگشتی در خود تابع، یکی از پارامترها باید تغییر نماید حال زیاد شود یا کم یا ... و این بسته به نیاز تابع خواهد بود .

ج) هر تابعی را نمی توان بصورت بازگشتی نوشت مگر اینکه رابطه منطقی و ریاضی در این مورد برای آن پیدا کنیم .

ه) یک تابع بازگشتی باید دارای نوع برگشتی باشد وحداقل یک پارامتر ورودی داشته باشد .

مثال سری فیبوناچی را با هم به وسیله توابع بازگشتی در C++ بررسی می کنیم :

می دانیم که برای پیدا کردن فاکتوریل یک عدد باید خود عدد را در عدد قبلی ضرب کرده و حاصل آنرا هم به همین ترتیب در عدد قبلی ضرب و به همین ترتیب ادامه دهیم تا به 1 برسیم. لذا وقتی ضرب اعداد در هم ادامه پیدا می کند که به عد 1 برسیم و این شرط ما خواهد بود وهمینطور می دانیم که فاکتوریل 1 برابر با 1 است .

           5! = 5*4*3*2*1 = 120  
           n! = n*(n-1)*(n-2)*... تا زمانیکه n>1 باشد                            

برنامه سری فیبوناچی با توابع بازگشتی :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
#include <iostream.h>
#include <conio.h>

long factorial(int);      

int main()
{
    long number;

    cout << "Please type a number :" ;
    cin >> number;
            
    getch();
    return 0;
}

long factorial(int a)       
{
    if(a > 1)
        return ( a*factorial(a-1) );
    else
        return (1);
}
Please type a number :9
9! = 362880                         

خدمت عزیزان باید عرض کنم که در کد بالا نوعی را به نام long می بینیم که شامل اعداد صحیح بزرگتر از int می باشد . دلیل استفاده از این نوع این است که int شامل اعداد بین 32767 و -32767 است و چون جواب ما از این محدوده بیشتر است باید از long استفاده کنیم .

 

bekaran.com