بازگشت (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 — فقط ~۴ ضرب!

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

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