بازگشت (Recursion) در جولیا
توابع بازگشتی با مثالهای فاکتوریل، فیبوناچی و پیمایش تو در تو
بازگشت چیست؟
بازگشت (Recursion) یعنی تابع خودش را صدا بزند — با یک شرط توقف!
مثال کلاسیک: فاکتوریل
function factorial2(n)
if n <= 1
return 1 # شرط توقف
end
return n * factorial2(n - 1)
end
println(factorial2(5)) # 120
println(factorial2(10)) # 3628800
چطور کار میکند؟
factorial2(5)
= 5 × factorial2(4)
= 5 × 4 × factorial2(3)
= 5 × 4 × 3 × factorial2(2)
= 5 × 4 × 3 × 2 × factorial2(1)
= 5 × 4 × 3 × 2 × 1
= 120
هر تابع بازگشتی باید شرط توقف (base case) داشته باشد، وگرنه تا سرریز پشته ادامه میدهد!
فیبوناچی
function fib(n)
if n <= 2
return 1
end
return fib(n - 1) + fib(n - 2)
end
for i in 1:8
print(fib(i), " ")
end
-- 1 1 2 3 5 8 13 21
شمارش معکوس
function countdown(n)
if n == 0
println("شروع! 🚀")
return
end
println("$n...")
countdown(n - 1)
end
countdown(5)
بازگشت با آرایهها
-- شمارش عناصر تو در تو
function deepCount(arr)
count = 0
for item in arr
if item isa Array
count += deepCount(item)
else
count += 1
end
end
return count
end
data = [1, 2, [3, 4, [5, 6]], 7]
println(deepCount(data)) # 6
بازگشت در برابر حلقه
-- با بازگشت
function sumRec(n)
if n == 0 return 0 end
return n + sumRec(n - 1)
end
-- با حلقه (در جولیا سریعتر!)
function sumLoop(n)
total = 0
for i in 1:n
total += i
end
return total
end
println(sumRec(10), " ", sumLoop(10)) # 55 55
جولیا برای بازگشت tail-call optimization ندارد — برای n بزرگ از حلقه یا توابع برداری استفاده کنید. بازگشت برای ساختارهای تو در تو (درخت، JSON) عالی است.
مثال: توان سریع
function fastPower(base, exp)
if exp == 0
return 1
end
half = fastPower(base, exp ÷ 2)
if exp % 2 == 0
return half * half
else
return base * half * half
end
end
println(fastPower(2, 10)) # 1024 — فقط ~۴ ضرب!
این مبحث بخشی از دوره آموزش کامل جولیا است.