بازگشت (Recursion)
بازگشت فرایندی است که در آن متد مدام خود را فراخوانی میکند تا زمانی که به یک مقدار مورد نظر برسد. بازگشت یک مبحث پیچیده در برنامه نویسی است و تسلط به آن کار راحتی نیست. به این نکته هم توجه کنید که بازگشت باید در یک نقطه متوقف شود وگرنه برای بی نهایت بار، متد، خود را فراخوانی میکند. در این درس یک مثال ساده از بازگشت را برای شما توضیح میدهیم. فاکتوریل یک عدد صحیح مثبت (n!) شامل حاصل ضرب همه اعداد مثبت صحیح کوچکتر یا مساوی آن میباشد. به فاکتوریل عدد 5 توجه کنید.
5! = 5 * 4 * 3 * 2 * 1 = 120
بنابراین برای ساخت یک متد بازگشتی باید به فکر توقف آن هم باشیم. بر اساس توضیح بازگشت، فاکتوریل فقط برای اعداد مثبت صحیح است. کوچکترین عدد صحیح مثبت 1 است. در نتیجه از این مقدار برای متوقف کردن بازگشت استفاده میکنیم.
1: using System; 2: 3: public class Program 4: { 5: static long Factorial(int number) 6: { 7: if (number == 1) 8: return 1; 9: 10: return number * Factorial(number - 1); 11: } 12: 13: public static void Main() 14: { 15: Console.WriteLine(Factorial(5)); 16: } 17: }
120
متد مقدار بزرگی را بر میگرداند چون محاسبه فاکتوریل میتواند خیلی بزرگ باشد. متد یک آرگومان که یک عدد است و میتواند در محاسبه مورد استفاده قرار گیرد را میپذیرد. در داخل متد یک دستور if مینویسیم و در خط 7 می گوییم که اگر آرگومان ارسال شده برابر 1 باشد سپس مقدار 1 را برگردان در غیر اینصورت به خط بعد برو. این شرط باعث توقف تکرارها نیز میشود.
در خط 10 مقدار جاری متغیر number در عددی یک واحد کمتر از خودش (number – 1) ضرب میشود. در این خط متد Factorial خود را فراخوانی میکند و آرگومان آن در این خط همان number – 1 است. مثلاً اگر مقدار جاری number 10 باشد یعنی اگر ما بخواهیم فاکتوریل عدد 10 را به دست بیاوریم آرگومان متد Factorial در اولین ضرب 9 خواهد بود. فرایند ضرب تا زمانی ادامه مییابد که آرگومان ارسال شده با عدد 1 برابر نشود. شکل زیر فاکتوریل عدد 5 را نشان میدهد.
کد بالا را به وسیله یک حلقه for نیز میتوان نوشت.
factorial = 1; for ( int counter = number; counter >= 1; counter-- ) factorial *= counter;
این کد از کد معادل بازگشتی آن آسانتر است. از بازگشت در زمینههای خاصی در علوم کامپیوتر استفاده میشود. استفاده از بازگشت حافظه زیادی اشغال میکند پس اگر سرعت برای شما مهم است از آن استفاده نکنید.
سلام کد زیر رو شما تو این صفه نوشتید ی سوال دارم
ببخشید متد فاکتوریل چجوری خودش تشخیص میده ک باید دباره تکرار بشع؟
من این قسمتش ک حساب میکنم باید 20 رو برگردونه منظورم کد زیره
و جایی هم ننوشتیم ک باید مقداری رو برگردونه و لی منم تو کامپایلر امتحان کردم 120 رو برگردوند
چجوری میفهمه ک باید تکرار بشع ما ک چیز خاصی ننوشتیم
سلام
ما دوبار متد Factorial رو فراخوانی کردیم. یه بار خط 15 و یه بار خط 10.
موقعی که تو خط 15 ما متد Factorial رو صدا می زنیم خطوط 10-7 اجرا میشن. نکته همین خط 10 هستش. موقعی ما 5 رو ارسال می کنیم، کدهای 8-7 اجرا نمیشن و خط 10 اجرا میشه. تو این خط ما دوباره متد رو فراخوانی کردیم. با فراخوانی دوم متد، برنامه دوباره به خطوط 8-7 میره و چون تو فراخوانی دوم متد، عدد 4 ارسال میشه، باز خطوط 8-7 اجرا نمیشن. این فرایند تا زمانی که به عدد 1 میرسیم ادامه پیدا میکنه. پس اینکه متد چطور میفهمه باید تکرار بشه، دلیلش اینه که در خط 10 فراخوانی شده و دوباره کدها از اول اجرا میشن و …
سلام.
میشه یه کپی از سایت برام ایمیل کنید؟
اکانت ویژه هم دارم…
میخوام سایت بصورت آفلاین داشته باشم میشه لطف کنید برام ایمیلش کنید؟
سلام، خیر
اکانتی که گرفتین واسه یک ماه استفاده از مطالبه نه دائمی، شما اشتراک یک ساله هم بگیرین بازم نمیشه
سلام.
ممنون از مطالب مفیدتان.
فقط اگر امکان دارد جمله ی آخرتان را اصلاح فرمایید. شما نوشته اید:”پس اگر سرعت برای شما مهم است از آن استفاده نکنید.” در صورتی که بهتر بود
می نوشتید: “پس اگر مصرف کمتر حافظه برای شما مهم است از آن استفاده نکیند.” یا اینکه “پس اگر سرعت برای شما مهم نیست از آن استفاده نکنید.”
سلام دوست عزیز.ممنون از راهنماییتون.
ولی فکر کنم جمله ای که نوشتم درسته. چون با اشغال حافظه سرعت پایین میاد. پس کسی که سرعت واسش مهمه از بازگشت استفاده نمی کنه.
پس هم جمله من درسته و هم جمله اول شما.
با تشکر
پاسختون عالی بود.
از اینکه به نظرات ما اهمیت می دهید، بسیار سپازگزاریم.
خواهش می کنم دوست عزیز