تابع بازگشتی در پایتون — به زبان ساده
در این مطلب، مفهوم تابع بازگشتی در پایتون بیان و روش ساخت آن آموزش داده شده است. پیشتر، در مطلب «تابع در پایتون -- به زبان ساده»، مفهوم تابع، نحو آن در پایتون، چگونگی فراخوانی تابع، مفهوم «داکاسترینگ» (Docstring)، کاربرد دستور return و انواع تابع در پایتون مورد بررسی قرار گرفت. سپس، در مطلب «آرگومان تابع در پایتون — به زبان ساده»، مفهوم آرگومان و انواع آرگومانهای موجود در پایتون بیان و مثالهای متعددی برای درک بهتر مطلب ارائه شد. در این مطلب، تابع بازگشتی در پایتون مورد بررسی قرار خواهد گرفت.
مفهوم تابع بازگشتی در پایتون
«بازگشت» (Recursion) فرایند تعریف چیزی با توجه به خودش است. یک مثال دنیای فیزیکی از این امر، قرار دادن دو آینه موازی به صورتی است که روبروی یکدیگر قرار بگیرند. هر شیئی بین این دو آینه قرار بگیرد، به صورت بازگشتی منعکس میشود.
تابع بازگشتی در پایتون
در پایتون، یک تابع میتواند تابع دیگری را فراخوانی کند. حتی این امکان وجود دارد که تابع خودش را فراخوانی کند. این نوع تابع را «تابع بازگشتی» (Recursive Functions) میگویند. در ادامه، مثالی از تابع بازگشتی برای پیدا کردن فاکتوریل یک عدد صحیح آورده شده است. فاکتوریل یک عدد، حاصل ضرب همه اعداد صحیح از ۱ تا خود آن عدد است.
برای مثال، فاکتوریل عدد ۶ که به صورت !۶ نوشته میشود، برابر با ۷۲۰=۶*۵*۴*۳*۲*۱ است.
مثالی از تابع بازگشتی در پایتون
1# An example of a recursive function to
2# find the factorial of a number
3
4def calc_factorial(x):
5 """This is a recursive function
6 to find the factorial of an integer"""
7
8 if x == 1:
9 return 1
10 else:
11 return (x * calc_factorial(x-1))
12
13num = 4
14print("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
بازگشت هنگامی به پایان میرسد که عدد به یک کاهش پیدا کند. به این کار، شرایط پایه گفته میشود. هر تابع بازگشتی باید یک شرط پایه داشته باشد تا بازگشت را متوقف کند؛ در غیر این صورت، تابع تا بینهایت خودش را تکرار میکند.
مزایای تابع بازگشتی
- توابع بازگشتی موجب میشوند که کد تمیز و منظم باشد.
- یک وظیفه پیچیده را میتوان با استفاده از توابع بازگشتی به زیرمسالههای کوچکتر شکست.
- تولید توالی با استفاده از توابع بازگشتی، نسبت به انجام این کار با استفاده از تکرارهای تو در تو (حلقهها)، آسانتر است.
معایب تابع بازگشتی
- گاهی، دنبال کردن منطق نهفته در پشت توابع بازگشتی دشوار است.
- فراخوانی بازگشتی پرهزینه (ناکارآمد) است، زیرا حافظه و زمان زیادی مصرف میکند.
- عیبیابی (دیباگ کردن) توابع بازگشتی دشوار است.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون
- آموزش تکمیلی برنامهنویسی پایتون
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
- آموزش پایتون (Python) — مجموعه مقالات جامع وبلاگ فرادرس
^^
فک کنم تنها کسی ام که هیچ وقت نمیخام از تابع بازگشتی استفاده کنم، چون خیلی سخته برام لطفا یک راهی بگین تا بتونم رفع کنم.
سلام دوست عزیز خسته نباشید من اصلا درکش نمیکنم
این کد ساده رو دیباگ کردم دوره خودش میچرخه شرط گذاشتم نباید وارد شرط بشه ولی میشه
میشه یکم راهنمایی کنین ممنون میشم
def test(x):
if x> 0:
test(x – 1)
print(x)
test(1)
# ======>>>
1
2
3
4
5
6
7
8
9
10
انتظار داشتم وارد بلاک if نشه بیاد بیرون!!
وقتی if تعریف میکنید ، باید یه else هم تعریف کنید .
def test(x):
if x> 0:
test(x – 1)
else:
print(x)
test(1)
این اصلاح شده ی کد شماست .
بسم الله الرحمن الرحیم
سلام علیکم
قلم خوبی دارید واقعا ممنون ان شاالله که همیشه در مسائل علمی مرجع باشید برای کسانی که تشنه علم هستند نه پول.
سلام خسته نباشید میخواستم یه سوال بپرسم این ادیتوری که کدهارو توش می نویسید و تصویرش داخل سایت هست اسمش چیه ؟
VSCODE