سلام رفقای برنامه‌نویس! توی این مقاله می‌خوایم با یه مبحث خیلی مهم و کاربردی آشنا بشیم: تابع بازگشتی در زبان C. یعنی تابعی که خودش دوباره خودش رو صدا می‌زنه! 😄 این سبک‌ از تعریف تابع معمولاً برای حل مسائل پیچیده یا شکستن یه مسئله به زیرمسئله‌های کوچیک‌تر استفاده می‌شه.

تابع بازگشتی یعنی چی؟

تابع بازگشتی یا Recursive Function یعنی یه تابع در تعریف خودش خودش رو دوباره فراخوانی کنه. وقتی فراخوانی پشت‌سر‌هم اتفاق بیفته، باید یه نقطه توقف داشته باشه که بهش می‌گن شرط پایه یا Base Case.

تا وقتی اون شرط برقرار نشده، تابع خودش رو صدا می‌زنه، ولی وقتی به شرط پایه رسید، برگشت اتفاق می‌افته و مرحله به مرحله نتیجه‌ها جمع می‌شن.

یه نمونه‌ی کلاسیک از استفاده از توابع بازگشتی، محسابه فاکتوریل یک عدد هست. تابع فاکتوریل 𝑛! به صورت بازگشتی به صورت زیر تعریف میشه:

factorial(𝑛)={1if 𝑛=0𝑛×factorial(𝑛1)if 𝑛>0

چطور تابع خودش رو صدا می‌زنه؟

void callMe() {
    // انجام کارها
    callMe();  // تابع خودش رو صدا می‌زنه
}

int main() {
    callMe();  // شروع اولیه از main
    return 0;
}

اگه شرط توقف نذاریم، همین‌طوری خودش رو صدا می‌زنه تا حافظه پر بشه و برنامه کرش کنه! پس حتماً باید توی کد، یه شرط بذاریم که تابع متوقف بشه.

مثال بازنویسی‌شده: مجموع اعداد طبیعی با تابع بازگشتی

توی این برنامه می‌خوایم مجموع اعداد طبیعی رو تا عدد واردشده حساب کنیم، ولی با تابعی که خودش خودش رو صدا می‌زنه:

#include <stdio.h>

int naturalSum(int num);  // نمونه اولیه

int main() {
    int userInput, result;

    printf("Enter a number greater than zero: ");
    scanf("%d", &userInput);

    result = naturalSum(userInput);  // فراخوانی تابع بازگشتی
    printf("Sum = %d", result);

    return 0;
}

int naturalSum(int num) {
    if (num != 0)
        return num + naturalSum(num - 1);  // فراخوانی بازگشتی
    else
        return 0;  // شرط توقف
}

خروجی نمونه:

Enter a number greater than zero: 4
Sum = 10

اگه عدد 4 وارد کنیم، تابع اول خودش رو با 3 صدا می‌زنه، بعد با 2، بعد 1، و نهایتاً با 0. وقتی عدد به 0 رسید، شرط else اجرا می‌شه و تابع دیگه خودش رو صدا نمی‌زنه. جواب‌ها مرحله‌به‌مرحله برمی‌گردن و جمع می‌شن تا مجموع نهایی حساب شه.

 

Image

مزایا و معایب تابع بازگشتی

  • ✅ کد رو کوتاه و خوانا می‌کنه
  • ✅ مخصوص الگوریتم‌های شکستی و پیمایشی مثل درخت‌ها، مرتب‌سازی‌ها و الگوریتم‌های گراف
  • ⚠️ اگه شرط توقف نداشته باشه، باعث حلقه بی‌نهایت و کمبود حافظه می‌شه
  • ⚠️ نسبت به حلقه‌ها ممکنه کمی کندتر باشه چون حافظه بیشتری مصرف می‌کنه

مثلاً توی الگوریتم Quick Sort یا پیمایش DFS در درخت‌ها و گراف‌ها، تابع بازگشتی خیلی کارایی داره و باعث ساختار منظم‌تر کد می‌شه.

امیدواریم این آموزش براتون مفید بوده باشه! این مقاله توسط سایت علمی رایشمند برای شما آماده شده است.