آموزش کار با SQL اس کیو ال
کار با دستور شرطی if case when در sql
16 اردیبهشت 1400
آموزش برنامه نویسی با c++ سی پلاس پلاس
جمع ضرب ترانهاده دو ماتریس آرایه در c++
20 اردیبهشت 1400
Show all

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

آموزش برنامه نویسی با c++ سی پلاس پلاس

کار با متغیر استاتیک static تمرین و مثال هایی از تابع ( توابع ) بازگشتی در c++

در این آموزش قصد داریم تا روش کار با متغیر های استاتیک static را با تمرین و مثال هایی از تابع ( توابع ) بازگشتی را در c++ به شما نشان دهیم؛

تفاوت متغیر معمولی و استاتیک ( static ) در زبان 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

نکته : با توجه به اینکه مقدار متغیر a بصورت استاتیک در c++ تابع تعریف شده است مقدار آن پس از خروج از تابع همچنان در حافظه باقی میماند .

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

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

در نمونه زیر تابع f1 یک تابع بازگشتی در c++ است که وقتی f1 خود را فراخوانی مینماید تابع f1 جدیدی در حافظه کامپیوتر تشکیل میشود و سپس اجرا می گردد . این رویه ادامه یافته تا نهایتا به f1 نهایی برسیم که خود را فراخوانی نمی کند .

توابع بازگشتی غیر مستقیم در c++ :

اغلب تابع های بازگشتی جهت حل مساله هایی کار برد دارند که ماهیت آنها باز گشتی میباشد یعنی مقدار جدید آنها به مقدار قبلی بستگی خواهد داشت بنابراین در توابع بازگشتی بایستی دو نکته مهم زیر را مد نظر قرار دهیم :

  • فنون بازگشتی

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

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

مثال 1 : سورس کد برنامه تابع فاکتوریل را بصورت بازگشتی در 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);
}

 

مثال 2 : سورس کد برنامه تابع رابطه ی ترکیب در 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);
}

 

مثال 3 ( تمرین ) : خروجی تابع زیر برای n=5 چه خواهد بود ؟

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

 

مثال 4 ( تمرین ): خروجی تابع زیر را بنویسید اگر m=3 و n=5 باشد.

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

 

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

 

1,1,2,3,5,8,13,…

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

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

 

 

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

تصویر بالا نمونه بازگشتی جمله 6 م دنباله فیبوناتچی را نشان میدهد .

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

 

مثال 6 : برنامه ای که با استفاده از تابع بازگشتی مقدار باقیمانده تقسیم دو عدد صحیح را در c++ محاسبه و چاپ می کند :

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

 

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

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

 

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

توابع بازگشتی مانند حلقه while عمل میکند که شرط اجرایش برعکس شرط  if است و مقداری که در حلقه while برگردانده میشود به اسم تابع برگشت داده میشود برای مثال به عملکرد تبدیل تقسیم ( مثال 7 ) با استفاده از حلقه 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 ) خواهد بود .

 

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

شرکت مهندسی اندیشه تراشه ویرا

تلفن تماس : 09120613870-02176490358

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *