همه چیز در مورد توابع بازگشتی پایتون
توابع بازگشتی پایتون، توابعی هستند که در داخل خود به فراخوانی خودشان میپردازند. این توابع میتوانند تا زمانی که شرطی برقرار باشد، به صورت بازگشتی فراخوانی شوند. در این مطلب از مجله مکتوب میخواهیم در مورد توابع بازگشتی در پایتون و رسالت آنها توضیحاتی ارائه دهیم.
توابع بازگشتی پایتون چیست؟
تابع بازگشتی (recursive function) در زبان برنامهنویسی پایتون نوع تخصصی از تابع است که در کد خود، خود را به طور مکرر فراخوانی میکند و این فراخوانی تا زمانی ادامه مییابد که شرطی خاص برآورده شود که در این مرحله فراخوانی خود را متوقف میکند. برای مثال، تابع «fn()» زیر را در پایتون در نظر بگیرید:
def fn():
# ...
fn()
# ...
در این قطعه کد، «fn()» یک تابع بازگشتی است زیرا خود را فراخوانی میکند. «…#» نشاندهنده کد دیگری است که بخشی از منطق تابع است.
با این حال، تابع بازگشتی پایتون ضروری است که شامل یک عبارت شرطی باشد که به عنوان شرط پایان عمل میکند. این شرط تعیین خواهد کرد که چه زمانی تابع باید خود را فراخوانی نکند و در عوض یک نتیجه را برگرداند یا یک عمل متفاوت را انجام دهد. یک ساختار معمولی برای توابع بازگشتی پایتون شامل عبارت «if» بوده که در زیر نشان داده شده است:
def fn():
# ...
if condition:
# stop calling itself
else:
fn()
# ...
توابع بازگشتی اغلب در برنامهنویسی به کار میرود تا مسائل پیچیده را به زیرمسائل سادهتر و قابل مدیریتتر تقسیم کند. این رویکرد حل مسئله را بهتر و پیادهسازی آسانتر میکند. توابع بازگشتی معمولاً در حوزههای مختلف علوم کامپیوتر، مانند ساختارهای داده (به عنوان مثال، درختان و نمودارها) و الگوریتمها (به عنوان مثال، جستجوهای باینری) استفاده میشوند، جایی که آنها نقش مهمی در حل مسائل محاسباتی پیچیده دارند.
پیشنهاد مطالعه: آموزش کار با انواع حلقه در پایتون
آموزش تابع بازگشتی پایتون
تابع بازگشتی در پایتون نوعی ساختار برنامهنویسی است که در آن تابع تا زمانی که یک شرط مشخص برآورده شود، خود را فراخوانی میکند. این تکنیکی است که اغلب در حل مسئله برای تجزیه وظایف پیچیده به وظایف فرعی سادهتر و قابل مدیریتتر استفاده میشود.
مثال تابع بازگشتی در پایتون: یک تابع شمارش معکوس ساده:
برای نشان دادن مفهوم یک تابع بازگشتی، اجازه دهید یک مثال ساده را در نظر بگیریم که در آن تابعی به نام «count_down()» ایجاد میکنیم. این تابع برای شمارش معکوس از یک عدد معین به صفر طراحی شده است.
برای مثال، اگر «count_down(3)» را فراخوانی کنیم، خروجی مورد نظر به صورت زیر است:
در اینجا تعریف اولیه تابع «count_down()» آمده است:
def count_down(start):
""" Count down from a number """
print(start)
با این حال، فراخوانی این تابع با «count_down(3)» تنها عدد 3 را نمایش میدهد. برای رسیدن به رفتار شمارش معکوس مورد نظر، باید تابع را با مقادیر کاهشی فراخوانی کنیم، یعنی ابتدا 3، سپس 2 و در نهایت 1.
برای پیادهسازی این رویکرد، باید تابع «count_down()» را بازگشتی کنیم. در اینجا نسخه اصلاح شده تابع و فراخوانی آن آمده است:
def count_down(start):
""" Count down from a number """
print(start)
# call the count_down if the next
# number is greater than 0
next = start - 1
if next > 0:
count_down(next)
count_down(3)
هنگامی که این برنامه اجرا میشود، خروجی شمارش معکوس مورد انتظار را تولید میکند:
تابع «count_down()» بازگشتی خود را فراخوانی میکند تا زمانی که عدد بعدی در دنباله شمارش معکوس بزرگتر از صفر باشد. این الگوی بازگشتی تا زمانی که شمارش معکوس به صفر برسد ادامه مییابد و در این مرحله بازگشت متوقف میشود.
استفاده از توابع بازگشتی پایتون برای محاسبه مجموع دنباله
هنگامی که با وظیفه محاسبه مجموع یک دنباله، مانند مجموع اعداد از 1 تا 100 مواجه میشوید، یک رویکرد رایج شامل استفاده از یک حلقه for با تابع «range()» است. به مثال زیر توجه کنید:
def sum(n):
total = 0
for index in range(n+1):
total += index
return total
result = sum(100)
print(result)
خروجی این کد به صورت زیر خواهد بود:
با این حال، شما همچنین میتوانید از رویکرد توابع بازگشتی پایتون برای محاسبه مجموع یک دنباله استفاده کنید. این روش بازگشتی بر این مفهوم استوار است که:
- sum(n) = n + sum(n-1)
- sum(n-1) = n-1 + sum(n-2)
- …
- sum(0) = 0
در اینجا اجرای تابع «sum_sequence()» بازگشتی است:
def sum(n):
if n > 0:
return n + sum(n-1)
return 0
result = sum(100)
print(result)
این نسخه بازگشتی از تابع به طور مشخصی مختصرتر و خواناتر است. همچنین، میتوانید از عملگر سهتایی برای سادهتر کردن تابع «sum_sequence()» به صورت زیر استفاده کنید:
def sum(n):
return n + sum(n-1) if n > 0 else 0
result = sum(100)
print(result)
با استفاده از این رویکرد بازگشتی، میتوانید به طور مؤثر مجموع یک دنباله را محاسبه کنید و راهحل کوتاهتر و ظریفتری برای مسئله ارائه دهید.
پیشنهاد مطالعه: آموزش کار با لیست در پایتون
تابع بازگشتی پایتون برای محاسبه فاکتوریل
فاکتوریل یک عدد صحیح غیر منفی n با n نشان داده میشود! و به عنوان حاصلضرب تمام اعداد صحیح مثبت از 1 تا n تعریف میشود. در اینجا یک تابع Python بازگشتی برای محاسبه فاکتوریل یک عدد صحیح غیر منفی داده شده است:
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)
بیایید نحوه عملکرد این تابع بازگشتی را تحلیل کنیم:
- حالت پایه: تابع بررسی میکند که آیا n برابر با 0 یا 1 است. اگر یکی از این شرایط وجود داشته باشد، تابع 1 را برمیگرداند. این به این دلیل است که فاکتوریل 0 و 1 1 است.
- حالت بازگشتی: اگر n برابر با 0 یا 1 نباشد، تابع n * فاکتوریل (n – 1) را محاسبه میکند. اینجاست که بازگشت اتفاق میافتد. تابع خود را با آرگومان n – 1 فراخوانی میکند، به این معنی که فاکتوریل عدد یک را کمتر از n محاسبه خواهد کرد. این فرآیند به صورت بازگشتی ادامه مییابد تا زمانی که n به 0 یا 1 تبدیل شود، در این مرحله حالت پایه فعال میشود و بازگشت شروع به باز شدن میکند.
بیایید اجرای فاکتوریل (4) را به عنوان مثال دنبال کنیم:
factorial(4)
--> returns 4 * factorial(3)
--> returns 3 * factorial(2)
--> returns 2 * factorial(1)
--> returns 1 (base case)
<-- returns 2 * 1 = 2
<-- returns 3 * 2 = 6
<-- returns 4 * 6 = 24
همانطور که میبینید، تابع با فراخوانی خود با مقادیر تدریجی کوچکتر n، محاسبه فاکتوریل را به مسائل فرعی کوچکتر تقسیم کرده و سپس نتایج را به صورت بازگشتی ارائه میکند و این رویکرد توابع بازگشتی پایتون است.
توجه به این نکته مهم است که اگرچه بازگشت در python ابزار قدرتمندی است، اما به دلیل افزایش تعداد فراخوانیهای تابع و استفاده از پشته، میتواند منجر به مشکلات عملکرد و حافظه برای ورودیهای بزرگ شود. در برخی موارد، رویکرد تکراری ممکن است کارآمدتر باشد. برای تمرین برنامهنویسی پایتون در توابع بازگشتی پیشنهاد ما به شما انجام تمرینهای عملی زیر است.
- محاسبه سری فیبوناچی در پایتون به صورت بازگشتی
- محاسبه ب م م عدد به صورت بازگشتی
- و غیره
پیشنهاد مطالعه: آموزش کار با متغیرها در پایتون
سخن پایانی
تابع بازگشتی نوعی ساختار برنامهنویسی است که در آن یک تابع به طور مکرر خود را فراخوانی میکند تا زمانی که یک شرط پایان خاص برآورده شود. این الگوی تکرارشونده یک جنبه اساسی توابع بازگشتی است.
علاوه بر این، هر توابع بازگشتی در پایتون شامل یک عنصر حیاتی است: یک شرط پایان. این شرایط به عنوان مکانیزمی عمل میکند که از فراخوانی بیپایان تابع جلوگیری کرده و اطمینان میدهد که بازگشت در نهایت متوقف میشود و نتیجه مطلوب حاصل میشود. در مطلب فوق توابع بازگشتی پایتون با زبانی ساده و به همراه چندین مثال مورد بررسی قرار گرفتند. به امید اینکه مورد توجه شما قرار گرفته باشد.
آموزش پایتون
اگر به فکر یادگیری برنامهنویسی پایتون و کار با توابع بازگشتی در پایتون هستید ابتدا باید اصول برنامهنویسی و مقدمات پایتون را یاد بگیرید. برای کمک به یادگیری پایتون در مکتب خونه انواع دوره آموزش پایتون موجود است که به کاربران کمک میکند به سادهترین شکل ممکن پایتون را بیاموزند. از طریق صفحه آموزش پایتون مکتب خونه میتوانید انواع دورههای موجود برای پایتون را ببینید.
منبع: pythontutorial