برنامه نویسی ۸۸۳۲ بازدید

در این مطلب، مفهوم تابع بازگشتی در پایتون بیان و روش ساخت آن آموزش داده شده است. پیش‌تر، در مطلب «تابع در پایتون — به زبان ساده»، مفهوم تابع، نحو آن در پایتون، چگونگی فراخوانی تابع، مفهوم «داک‌استرینگ» (Docstring)، کاربرد دستور return و انواع تابع در پایتون مورد بررسی قرار گرفت. سپس، در مطلب «آرگومان تابع در پایتون — به زبان ساده»، مفهوم آرگومان و انواع آرگومان‌های موجود در پایتون بیان و مثال‌های متعددی برای درک بهتر مطلب ارائه شد. در این مطلب، تابع بازگشتی در پایتون مورد بررسی قرار خواهد گرفت.

مفهوم تابع بازگشتی در پایتون

«بازگشت» (Recursion) فرایند تعریف چیزی با توجه به خودش است. یک مثال دنیای فیزیکی از این امر، قرار دادن دو آینه موازی به صورتی است که رو‌بروی یکدیگر قرار بگیرند. هر شیئی بین این دو آینه قرار بگیرد، به صورت بازگشتی منعکس می‌شود.

تابع بازگشتی در پایتون

در پایتون، یک تابع می‌تواند تابع دیگری را فراخوانی کند. حتی این امکان وجود دارد که تابع خودش را فراخوانی کند. این نوع تابع را «تابع بازگشتی» (Recursive Functions) می‌گویند. در ادامه، مثالی از تابع بازگشتی برای پیدا کردن فاکتوریل یک عدد صحیح آورده شده است. فاکتوریل یک عدد، حاصل ضرب همه اعداد صحیح از ۱ تا خود آن عدد است. برای مثال، فاکتوریل عدد ۶ که به صورت !۶ نوشته می‌شود، برابر با ۷۲۰=۶*۵*۴*۳*۲*۱ است.

مثالی از تابع بازگشتی در پایتون

# An example of a recursive function to
# find the factorial of a number

def calc_factorial(x):
    """This is a recursive function
    to find the factorial of an integer"""

    if x == 1:
        return 1
    else:
        return (x * calc_factorial(x-1))

num = 4
print("The factorial of", num, "is", calc_factorial(num))

در مثال بالا، ()calc_factorial یک تابع بازگشتی است؛ زیرا که خودش را فراخوانی می‌کند. هنگامی که این تابع با یک عدد صحیح مثبت فراخوانی شود، به صورت بازگشتی خودش را ضمن کاهش عدد، فراخوانی می‌کند. هر فراخوانی تابع، عدد را با فاکتوریل عدد یک واحد کوچک‌تر از خودش ضرب می‌کند تا هنگامی که عدد فراخوانی شده برابر با یک شود. فراخوانی بازگشتی را می‌توان در گام‌های زیر تشریح کرد.

calc_factorial(4) # 1st call with 4
4 * calc_factorial(3) # 2nd call with 3
4 * 3 * calc_factorial(2) # 3rd call with 2
4 * 3 * 2 * calc_factorial(1) # 4th call with 1
4 * 3 * 2 * 1 # return from 4th call as number=1
4 * 3 * 2 # return from 3rd call
4 * 6 # return from 2nd call
24 # return from 1st call

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

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

  • توابع بازگشتی موجب می‌شوند که کد تمیز و منظم باشد.
  • یک وظیفه پیچیده را می‌توان با استفاده از توابع بازگشتی به زیرمساله‌های کوچک‌تر شکست.
  • تولید توالی با استفاده از توابع بازگشتی، نسبت به انجام این کار با استفاده از تکرارهای تو در تو (حلقه‌ها)، آسان‌تر است.

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

  • گاهی، دنبال کردن منطق نهفته در پشت توابع بازگشتی دشوار است.
  • فراخوانی بازگشتی پرهزینه (ناکارآمد) است، زیرا حافظه و زمان زیادی مصرف می‌کند.
  • عیب‌یابی (دیباگ کردن) توابع بازگشتی دشوار است.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۲۲ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«الهام حصارکی»، فارغ‌التحصیل مقطع کارشناسی ارشد مهندسی فناوری اطلاعات، گرایش سیستم‌های اطلاعات مدیریت است. او در زمینه هوش مصنوعی و داده‌کاوی، به ویژه تحلیل شبکه‌های اجتماعی، فعالیت می‌کند.

3 نظر در “تابع بازگشتی در پایتون — به زبان ساده

  • سلام دوست عزیز خسته نباشید من اصلا درکش نمیکنم
    این کد ساده رو دیباگ کردم دوره خودش میچرخه شرط گذاشتم نباید وارد شرط بشه ولی میشه
    میشه یکم راهنمایی کنین ممنون میشم

    def test(x):
    if x> 0:
    test(x – 1)
    print(x)
    test(1)
    # ======>>>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    انتظار داشتم وارد بلاک if نشه بیاد بیرون!!

  • بسم الله الرحمن الرحیم
    سلام علیکم
    قلم خوبی دارید واقعا ممنون ان شاالله که همیشه در مسائل علمی مرجع باشید برای کسانی که تشنه علم هستند نه پول.

  • سلام خسته نباشید میخواستم یه سوال بپرسم این ادیتوری که کدهارو توش می نویسید و تصویرش داخل سایت هست اسمش چیه ؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.