بازگشت (Recursion)
بازگشت فرایندی است که در آن تابع مدام خود را فراخوانی میکند تا زمانی که به یک مقدار مورد نظر برسد. بازگشت یک مبحث پیچیده در برنامه نویسی است و تسلط به آن کار راحتی نیست. به این نکته هم توجه کنید که بازگشت باید در یک نقطه متوقف شود وگرنه برای بی نهایت بار، تابع، خود را فراخوانی میکند. در این درس یک مثال ساده از بازگشت را برای شما توضیح میدهیم. فاکتوریل یک عدد صحیح مثبت (n!) شامل حاصل ضرب همه اعداد مثبت صحیح کوچکتر یا مساوی آن میباشد. به فاکتوریل عدد 5 توجه کنید.
5! = 5 * 4 * 3 * 2 * 1 = 120
بنابراین برای ساخت یک تابع بازگشتی باید به فکر توقف آن هم باشیم. بر اساس توضیح بازگشت، فاکتوریل فقط برای اعداد مثبت صحیح است. کوچکترین عدد صحیح مثبت 1 است. در نتیجه از این مقدار برای متوقف کردن بازگشت استفاده میکنیم.
1: def Factorial(number): 2: if (number == 1): 3: return 1; 4: return number * Factorial(number - 1); 5: 6: print(Factorial(5));
120
تابع مقدار بزرگی را بر میگرداند چون محاسبه فاکتوریل میتواند خیلی بزرگ باشد. تابع یک آرگومان که یک عدد است و میتواند در محاسبه مورد استفاده قرار گیرد را میپذیرد. در داخل تابع یک دستور if مینویسیم و در خط 2 می گوییم که اگر آرگومان ارسال شده برابر 1 باشد سپس مقدار 1 را برگردان در غیر اینصورت به خط بعد برو. این شرط باعث توقف تکرارها نیز میشود.
در خط 4 مقدار جاری متغیر number در عددی یک واحد کمتر از خودش (number – 1) ضرب میشود. در این خط تابع Factorial خود را فراخوانی میکند و آرگومان آن در این خط همان number – 1 است. مثلاً اگر مقدار جاری number 10 باشد یعنی اگر ما بخواهیم فاکتوریل عدد 10 را به دست بیاوریم آرگومان تابع Factorial در اولین ضرب 9 خواهد بود. فرایند ضرب تا زمانی ادامه مییابد که آرگومان ارسال شده با عدد 1 برابر نشود. شکل زیر فاکتوریل عدد 5 را نشان میدهد.
کد بالا را به وسیله یک حلقه while نیز میتوان نوشت.
num = 5; factorial = 1; while num > 1: factorial = factorial * num num = num - 1 print(factorial)
این کد از کد معادل بازگشتی آن آسانتر است. از بازگشت در زمینههای خاصی در علوم کامپیوتر استفاده میشود. استفاده از بازگشت حافظه زیادی اشغال میکند پس اگر سرعت برای شما مهم است از آن استفاده نکنید.