Recursion (بازگشت)
توابع بازگشتی در Go: فاکتوریل، فیبوناچی و شرط پایه.
بازگشت (Recursion) چیست؟
تابع بازگشتی تابعی است که خودش را فراخوانی میکند. برای مسائلی که به قطعات کوچکتر مشابه خودشان تقسیم میشوند عالی است.
دو بخش ضروری
- شرط پایه (Base Case): جایی که بازگشت متوقف میشود — بدون آن، حلقه بینهایت!
- گام بازگشتی: فراخوانی با ورودی کوچکتر
مثال کلاسیک: فاکتوریل
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 میشود!
قانون سرانگشتی: اگر مسئله ذاتاً بازگشتی است (درخت، گراف، تقسیم و حل) از بازگشت؛ در غیر این صورت حلقه معمولاً بهتر است.
این مبحث بخشی از دوره آموزش کامل گو است.