Recursion (بازگشت)

توابع بازگشتی در Go: فاکتوریل، فیبوناچی و شرط پایه.

بازگشت (Recursion) چیست؟

تابع بازگشتی تابعی است که خودش را فراخوانی می‌کند. برای مسائلی که به قطعات کوچکتر مشابه خودشان تقسیم می‌شوند عالی است.

دو بخش ضروری

  1. شرط پایه (Base Case): جایی که بازگشت متوقف می‌شود — بدون آن، حلقه بی‌نهایت!
  2. گام بازگشتی: فراخوانی با ورودی کوچکتر

مثال کلاسیک: فاکتوریل

func factorial(n int) int {
    // شرط پایه
    if n <= 1 {
        return 1
    }
    // گام بازگشتی
    return n * factorial(n-1)
}

factorial(5)
← 5 × factorial(4)
← 5 × 4 × factorial(3)
← 5 × 4 × 3 × factorial(2)
← 5 × 4 × 3 × 2 × factorial(1)
← 5 × 4 × 3 × 2 × 1 = 120

فیبوناچی

func fib(n int) int {
    if n <= 1 {
        return n
    }
    return fib(n-1) + fib(n-2)
}

fib(10)   ← 55

جمع آرایه به‌صورت بازگشتی

func sum(nums []int) int {
    if len(nums) == 0 {
        return 0   ← شرط پایه
    }
    return nums[0] + sum(nums[1:])   ← گام بازگشتی
}

بازگشت در برابر حلقه

ویژگیبازگشتحلقه
خوانایی (مسائل بازگشتی)عالیمتوسط
کارایی حافظهبیشتر (call stack)کمتر
خطر stack overflowداردندارد
هر فراخوانی بازگشتی فضایی در stack اشغال می‌کند — بازگشت خیلی عمیق (مثل fib(50) بدون memoization) باعث کندی شدید یا crash می‌شود!
قانون سرانگشتی: اگر مسئله ذاتاً بازگشتی است (درخت، گراف، تقسیم و حل) از بازگشت؛ در غیر این صورت حلقه معمولاً بهتر است.

این مبحث بخشی از دوره آموزش کامل گو است.

ابزارهای مرتبط