آموزش کار با متغیرهای static و توابع بازگشتی در c++

آموزش کار با متغیرهای static و توابع بازگشتی در c++

آموزش برنامه نویسی C++

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

تابع به اتمام رسید از حافظه پاک میشود. اما اگر متغیری در تابعی از نوع static

معرفی شود در اولین بار اجرای تابع برای آن حافظه در نظر گرفته میشود و متغیر

مقداردهی اولیه می گردد. وقتی کار تابع تمام شد متغیرهای static آن در حافظه باقی

می مانند و در فراخوانی های بعدی تابع از همان متغیرهای قبلی استفاده میشود.

مثال :


void p1(void);
void main()
{
    int i;
    for(i=0 ; i<10 ; i++)
        f1();
}
void f1()
{
    static int a=10;
    int b=6;
    a++; b--;
    cout<<a<<b;
}

خروجی تابع بالا :

115125135145…205

آموزش کار با توابع بازگشتی ( recursive ) در c++  :

در توابع معمولی یک تابع تابع دیگر را فراخوانی میکند.در مثال زیر تابع f1 یک تابع بازگشتی در c++

می باشد. هنگامی که f1 خودش را فراخوانی میکند یک f1 جدید در حافظه ی اصلی

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

که خودش را فراخوانی نکند.

توابع بازگشتی غیرمستقیم نیز می توانیم داشته باشیم.

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

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

1- فنون بازگشتی

2-شرط خاتمه ی فراخوانی

مثال :

سورس کد برنامه تابع فاکتوریل بصورت بازگشتی در c++

n! =1*2*3*…*n

n! =n(n-1)!   فرمول بازگشتی

1!   شرط خاتمه


long int fact(int n)
{
    if(n<=1)
    return 1;
    return n*fact(n-1);
}

مثال :

سورس کد برنامه تابع رابطه ی ترکیب در c++

(n , m)= n!/m! * (n-m)!       n>=m

(n , m)= (n-1 , m)+ (n-1 , m-1)     فرمول بازگشتی

m=1     (n , 1)=n     شرط خاتمه

m=n     (n , n)=1


long int tk( int n , int m)
{
    if(n==m) return 1;
    if(m==1) return n;
    return tk(n-1 , m)+ tk(n-1 , m-1);
}

مثال :

خروجی تابع زیر برای n=5 چند است؟


void f(int n)
{
    if(n>=1)
    {
        cout<<n;
        f(n-1);
    }
}

مثال :

خروجی تابع زیر را بنویسید اگر m=3 و n=5 باشد.


void f(int n , int m)
{
    if(m==1) return n;
    return (n+ f(n , m-1) );
}

مثال :

برنامه ای بنویسید که دنباله ی فیبوناچی کوچکتر از 1000 بنویسد.

سورس کد برنامه دنباله فیبوناچی بصورت بازگشتی در c++

 

1,1,2,3,5.8,13,…

s(n)=s(n-1)+s(n-2)

s(n-1)=a , s(n-2)=b

کار با توابع بازگشتی در c++


void f(int a , int b)
{
    if(b<1000)
    {
       cout<<b;
       f(b , a+b);
    }
}

مثال :

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


int mod( int a , int b)
{
    if(b>a) return a;
    return mod(a-b , b);
}

مثال :

( سورس کد برنامه تقسیم بصورت بازگشتی در c++ )

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

را به صورت صحیح برگرداند.


int slash(int a , int b)
{
    if(a<b) return 0;
    return slash(a-b , b)+1;
}

نکته مهم برای استفاده از توابع بازگشتی در c++ :

توابع بازگشتی مثل حلقه ی while عمل میکند که شرط آن برعکس if است

و مقداری که در حلقه ی while قرار است برگردد به نام تابع برمی گردد به عنوان مثال به چگونگی

تبدیل تقسیم با حلقه ی while به تابع بازگشتی توجه کنید.


while(a>=b)
{
    a- =b;
    i++;
}
cout<<i;

یعنی i حاصل تقسیم a بر b است. معادل دستور بالا به صورت زیر است:


if(a<b) return 0;
return slash(a-b , b)+1;

در اینجا برعکس شرط دستور حلقه while را برای if می آوریم و در خط دوم

1+()slash حکم ++i را دارد و هربار که تکرار میشود a-b در a قرار می گیرد تا

تابع مجددا فراخوانی شود یعنی همان دستور a-b=a که همان a-=b خواهد بود.