در این مقاله، ما میخواهیم در مورد بازگشت و متدهای بازگشتی در #c صحبت کنیم. علاوه بر این، یاد میگیریم که چطور از متدهای بازگشتی استفاده کنیم و اینکه تفاوت آنها با متدهای معمولی چیست.
این مقاله، سرفصلی از دوره آموزشی زیر میباشد:
- راه اندازی محیط توسعه
- Data Type ها، Declaration ها و تعریف متغیرها در #C
- عملگرها در #c
- تبدیل نوع های داده ای
- ورودی و خروجی در #c
- کار با رشته ها
- شرطها در #c
- حلقه ها (While، Do-While، For)
- مدیریت خطاها
- Access Modifier ها
- متدها
- کلمات کلیدی Ref و Out
- بازگشت و متدهای بازگشتی
- آرایه ها (آرایه های تک بعدی و چند بعدی)
- کار با فایلها، StreamWriter و StreamReader
- کار با فایلها، File و Directory
اگر می خواهید محتویات کامل این دوره را ببینید ، می توانید بر روی لینک مبانی #c کلیک کنید.
اگر میخواهید سورس مثالهای این مقاله را دانلود کنید بر روی لینک سورس متدهای بازگشتی در #c کلیک کنید.
حالا بازگشت چیست؟
بازگشت یک مفهومی است که در آن، متد خودش را صدا میزند. هر متد بازگشتی یکجایی باید خاتمه پیدا کند، بنابراین ما باید یک شرطی بنویسیم که در آن شرط خاتمه بررسی شود. اگر این کار را انجام ندهیم، در نتیجه، آن متد بازگشتی، در یک حلقه بی پایان خود را صدا میزند.
مثال 1: یک برنامه بنویسید که جمع تمام اعداد از n تا m را به صورت بازگشتی محاسبه کند:
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 |
class Program { public static int CalculateSumRecursively(int n, int m) { int sum = n; if(n < m) { n++; return sum += CalculateSumRecursively(n, m); } return sum; } static void Main(string[] args) { Console.WriteLine("Enter number n: "); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Enter number m: "); int m = Convert.ToInt32(Console.ReadLine()); int sum = CalculateSumRecursively(n, m); Console.WriteLine(sum); Console.ReadKey(); } } |
![بازگشت در #c](https://expertmarket.ir/wp-content/uploads/2021/02/33-Recursion.png)
توضیح کد
متد CalculateSumRecursively، متد بازگشتی ما است که جمع اعداد از n تا m را محاسبه میکند. اولین کاری که باید انجام دهیم این است که متغیر sum را برابر با n قرار دهیم. سپس بررسی میکنیم که آیا متغیر n کوچکتر از متغیر m است یا نه. اگر اینچنین باشد سپس مقدار n را 1 واحد افزایش میدهیم و سپس متغیر sum را با نتیجه اجرای مجدد همین متد اما اینبار با افزودن یک واحد به n جمع میکنیم. اما اگر اینچنین نباشد سپس مقدار متغیر درون sum را برمیگردانیم.
#c برای هر متد بازگشتی، محل ذخیره حافظه خودش را رزرو میکند تا مقدارهای متدهای فراخوانی شده قبلی بر روی هم override نشوند.
مثالمان را در نمودار زیر ببینیم:
![متد بازگشتی در #c](https://expertmarket.ir/wp-content/uploads/2021/02/34-RecursionGraph.png)
مثال بعدی
با مثال 2، کمی بیشتر تمرین کنیم. یک برنامه بنویسید که تعداد دفعاتی که عدد میتواند به صورت مکرر بر 2 تقسیم شود و باقیمانده صفر شود را در خروجی چاپ کند:
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 |
class Program { public static int CountDivisions(double number) { int count = 0; if(number > 0 && number % 2 == 0) { count++; number /= 2; return count += CountDivisions(number); } return count; } static void Main(string[] args) { Console.WriteLine("Enter your number: "); double number = Convert.ToDouble(Console.ReadLine()); int count = CountDivisions(number); Console.WriteLine($"Total number of divisions: {count}"); Console.ReadKey(); } } |
نتیجه گیری
عالی.
حالا ما بازگشت و متدهای بازگشتی را یاد گرفتیم.
در مقاله بعدی، ما در مورد آرایه ها در #c، نحوه استفاده از آنها و انواع آرایه ها صحبت میکنیم.