بازگشت (Recursion)

بازگشت یا Recursion، فرایندی است که در آن تابع مدام خود را فراخوانی می‌کند، تا زمانی که به یک مقدار مورد نظر برسد. بازگشت یک مبحث پیچیده در برنامه نویسی است و تسط به آن کار راحتی نیست. به این نکته هم توجه کنید که بازگشت باید در یک نقطه متوقف شود وگرنه برای بی نهایت بار، تابع، خود را فراخوانی می‌کند. در این درس یک مثال ساده از بازگشت را برای شما توضیح می‌دهیم. فاکتوریل یک عدد صحیح مثبت (n!) شامل حاصل ضرب همه اعداد مثبت صحیح کوچکتر یا مساوی آن می‌باشد. به فاکتوریل عدد 5 توجه کنید.

5! = 5 * 4 * 3 * 2 * 1 = 120

بنابراین برای ساخت یک تابع بازگشتی باید به فکر توقف آن هم باشیم. بر اساس توضیح بازگشت، فاکتوریل فقط برای اعداد مثبت صحیح است. کوچک‌ترین عدد صحیح مثبت 1 است. در نتیجه از این مقدار برای متوقف کردن بازگشت استفاده می‌کنیم.

  1: fun Factorial(number: Int): Long
  2: {
  3:     return if (number == 1) 1 else number * Factorial(number - 1)
  4: }
  5: 
  6: fun main(args: Array<String>)
  7: {
  8:     println(Factorial(5))
  9: }
120

تابع مقدار بزرگی را بر می‌گرداند چون محاسبه فاکتوریل می‌تواند خیلی بزرگ باشد. تابع یک آرگومان که یک عدد است و می‌تواند در محاسبه مورد استفاده قرار گیرد را می‌پذیرد. در داخل تابع یک دستور if می‌نویسیم و در خط 3 می گوییم که اگر آرگومان ارسال شده برابر 1 باشد سپس مقدار 1 را برگردان در غیر اینصورت به خط بعد برو. این شرط باعث توقف تکرارها نیز می‌شود.

در خط 3 مقدار جاری متغیر number در عددی یک واحد کمتر از خودش (number – 1) ضرب می‌شود. در این خط تابع Factorial خود را فراخوانی می‌کند و آرگومان آن در این خط همان number – 1 است. مثلاً اگر مقدار جاری number عدد 10 باشد، یعنی اگر ما بخواهیم فاکتوریل عدد 10 را به دست بیاوریم آرگومان تابع Factorial در اولین ضرب 9 خواهد بود. فرایند ضرب تا زمانی ادامه می‌یابد که آرگومان ارسال شده با عدد 1 برابر نشود. شکل زیر فاکتوریل عدد 5 را نشان می‌دهد.
recursion-12-13-10-01
کد بالا را به وسیله یک حلقه for نیز می‌توان نوشت.

factorial = 1;

for ( int counter = number; counter >= 1; counter-- )
   factorial *= counter;

این کد از کد معادل بازگشتی آن آسان‌تر است. از بازگشت در زمینه‌های خاصی در علوم کامپیوتر استفاده می‌شود. استفاده از بازگشت حافظه زیادی اشغال می‌کند پس اگر سرعت برای شما مهم است از آن استفاده نکنید.