<!-- /* Font Definitions */ @font-face {font-family:Badr; panose-1:0 0 4 0 0 0 0 0 0 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; font-size:14.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} -->
انواع متغییر ها از نظر اعتبار :
1- محلی(local) :این نوع از متغییر ها را در داخل زیر برنامه ها تعریف می کنند و فقط در همان زیر برنامه ها اعتبار دارند .
2- سراسری (global) : این نوع از متغییرها را در ابتدای برنامه و قبل از همه توابع تعریف و پیاده سازی می کنند که امکان استفاده از آن ها در کلیه زیر برنامه ها وجود دارد.
استفاده از متغییر های سراسری :
دارای اثرات جانبی می باشد و به همین دلیل تا حد امکان از آن ها استفاده نمی کنیم .
اثرات جانبی بدین معنی است که اگر مقدار متغییر سراسری به نادرستی تغییر کند بخش های بعدی برنامه در صورت استفاده از آن نتایجش اشتباه خواهد بود .
زیربرنامه های بازگشتی (recursive) :
زیر برنامه هایی را گویند که خود را فراخوانی می کنند.
مسایلی را به صورت بازگشتی پیاده سازی می کنند که یا ماهیت بازگشتی داشته باشتند مانند فاکتوریل و فیبوناچی یا از ساختمان داده های غیر خطی استفاده می نماید.
ــ برای نوشتن یک تابع بازگشتی ابتدا مسأله را بامثال های عددی بررسی می کنیم سپس دو رابطه زیر را روی آن ها تعیین می کنیم .
1- رابطه بازگشتی : رابطه ای که طبق آن زیر برنامه خود را فراخوانی می کند .
2- نقطه توقف : مرحله که فراخوانی در آن توقف می کند .
مثال : بدست آوردن فاکتوریل عدد n :
!4 = !3 * 4
!3 = !2 * 3 رابطه بازگشتی n! = (n)(n-1)! :رابطه کلی
!2 = !1 * 2
!1 = !0 * 1 n = 0 n! = 1 : نقطه توقف
!0 = 1 نقطه توقف
پس از بدست آوردن دو رابطه مورد نظر کافیست با استفاده از دستورif – else زیر برنامه را پیاده سازی کنیم .
int fact (int n)
{
if (n == 0)
return 1 ;
else
return n*fact(n-1) ;
}
مثال : فرض کنید صرفاً امکان جمع و تفریق با یک وجود دارد زیر برنامه بازگشتی بنویسید که دو عدد صحیح مثبت را با یکدیگر جمع کند :
3+5 = ? : فرض int s (int n , int m );
s (5,3) = 1 + s (5 , 3-1) {
s (5,2) = 1 + s (5 , 2-1) if ( m==0)
s (5,1) = 1 + s (5, 1-1) return m ;
s (5,0) =1 : نقطه توقف else
return (1+ s(n , m-1)) ;
}
توجــه : اگر زیر برنامه ها را بعد از main بنویسیم error می دهد و باید پیش از تعریف بیاوریم.
مثال30) برنامه ای به صورت بازگشتی بنویسید که سری فیبوناچی را چاپ کند .
# include <stdio.h>
# include <conio.h>
Int fibo(int);
Int main ( )
{
Int n,I ;
Printf("enter any no \n");
Scanf( "%d",&n);
For (i=0;i<n;i++)
Printf("\n %d , fibo(i));
Getch ( );
Return 0 ;
}
Int fibo(int n);
{
If (n<=2)
Return(1);
Return(fibo(n-1)+fibo(n-2));
}