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

۴۱۵۹
۱۴۰۲/۰۳/۸
۴ دقیقه
PDF
آموزش متنی جامع
امکان دانلود نسخه PDF

در آموزش‌های پیشین مجله فرادرس، با توابع بازگشتی آشنا شدیم. در این آموزش، مطالبی را درباره روش پیاده سازی توابع بازگشتی در پایتون بیان می‌کنیم.

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

تابع در ریاضیات

توابع مفاهیمی در ریاضیات و برنامه‌نویسی هستند که انجام برخی اعمال و دستورات را تسهیل می‌کنند.

توابع در ریاضیات چند مشخصه دارند:

  1. می‌توانند یک یا چند ورودی دریافت کنند.
  2. می‌توانند یک یا چند خروجی داشته باشند.
  3. می‌توانند روی ورودی‌ها اعمالی انجام داده و در خروجی برگردانند به شرطی که به ازای ورودی‌های یکسان همواره خروجی مشخصی تولید کنند.

برای مثال، f(x)=x2f(x)=x^2 یک تابع با یک ورودی و یک خروجی است، در ضمن به ازای ورودی ثابت xx همواره مقدار x2x^2 را برمی‌گرداند.

تابع f(x,y)=xyf (x,y)=\frac x y نیز یک تابع با دو ورودی و یک خروجی است.

برعکس موارد فوق، رابطه f(x,y)=x±yf(x,y)=x±y یک تابع نیست، زیر به ازای برخی مقدایر از yy دو خروجی متمایز تولید می‌کند.

تابع در برنامه نویسی

اما در برنامه نویسی، مفهوم تابع اندکی متفاوت‌تر است:

1. یک تابع می‌تواند هیچ نوعی از ورودی نداشته باشد:

۲. یک تابع می‌تواند هیچ نوعی از خروجی‌ نداشته باشد:

3. یک تابع می‌تواند با گرفتن ورودی‌های یکسان، خروجی‌های متفاوتی تولید کند:

به این ترتیب، مشاهده می‌کنیم که توابع در برنامه‌نویسی می‌توانند برخی از مشخصه‌های توابع در ریاضیات را نداشته باشند.

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

  • برای مشاهده مجموعه آموزش‌های برنامه نویسی پایتون (Python) — مقدماتی تا پیشرفته + اینجا کلیک کنید.

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

توابع بازگشتی توابعی هستند که با گرفتن یک ورودی، می‌توانند پس از عملیاتی دوباره خود را فراخوانی کنند.

برای مثال تابع زیر پس از فراخوانی تا زمان بروی خطا، به چاپ کردن جمله Hello World ادامه خواهد داد:

یا تابع زیر به ترتیب اعداد nn تا بی‌نهایت را چاپ خواهد کرد:

به این ترتیب، فراخوانی تابع توسط خودش مشهود است.

توابع بازگشتی چه کاربردی دارند؟

در ادامه، به برخی از کاربردهای توابع بازگشتی اشاره می‌کنیم.

فاکتوریل

فاکتوریل یک عدد صحیح به صورت زیر تعریف می‌شود:

n!=n×(n1)×(n2)2×1,0!=1!=1\large n !=n \times(n-1) \times(n-2) \ldots 2 \times 1, \quad 0 !=1 !=1

برای پیاده‌سازی تابع فاکتوریل می‌توان به صورت زیر نوشت:

به این ترتیب، تابع مورد نظر کار خواهد کرد.

حال اندکی رابطه گفته‌شده را تغییر می‌دهیم:

n!=n×(n1)×(n2)2×1=n×(n1)!\large n !=n \times(n-1) \times(n-2) \ldots 2 \times 1=n \times(n-1) !

به این ترتیب، می‌تواند فاکتوریل عدد nn را به فاکتوریل عدد n1n-1 ربط داد. از این ویژگی بازگشتی می‌توان به صورت زیر استفاده کرد:

به این ترتیب، پیاده‌سازی تابع مورد نظر در خطوط کمتر و به راحتی انجام می‌شود.

دنباله فیبوناچی

دنباله فیبوناچی به صورت زیر تعریف می‌شود:

Fn=Fn1+Fn2,F1=F2=1\large F_{n}=F_{n-1}+F_{n-2}, \quad F_{1}=F_{2}=1

به این ترتیب، اگر بخواهیم این تابع را به شکل معمولی پیاده‌سازی کنیم خواهیم داشت:

حال اگر با استفاده از رابطه بازگشتی همین تابع را پیاده‌سازی کنیم خواهیم داشت:

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

مورد فوق حالت‌های مربوط به پیاده‌سازی روابط ریاضی بودند. فرض کنید لیستی نامنظم و تودرتو به شکل زیر داریم:

L=[1,2,[3,[4],[5],6,7],8,[[9]],10]\large L=[1,2,[3,[4],[5], 6,7], 8,[[9]], 10]

و از ما خواسته شده است با نوشتن تابعی، لیست‌های داخلی را ساده کرده و در نهایت به یک لیست واحد برسیم. برای حل این مسئله به شکل توابع معمولی، نیاز به کدنویسی زیادی است و یک راه‌حل محتمل برای حل آن، استفاده از توابع بازگشتی است.

یک تابع برای ساده‌سازی این لیست می‌نویسم که در ورودی لیست مورد نظر را می‌گیرد:

حال یک لیست خالی برای خروجی ایجاد می‌کنیم:

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

حال در صورت برقراری شرط، عضو مورد نظر را به لیست خروجی اضافه می‌کنیم و در صورت عدم برقراری شرط، خود تابع را بر روی عضو مورد نظر اعمال کرده و خروجی آن را به لیست خروجی اضافه می‌کنیم:

به این ترتیب، تابع آماده است.

حال آن را بر روی لیست آورده شده اعمال می‌کنیم:

و در خروجی به نتیجه زیر می‌رسیم:

[1,2,3,4,5,6,7,8,9,10]\large [1,2,3,4,5,6,7,8,9,10]

که خروجی مطلوب ما است.

جمع‌بندی

در این آموزش، با توابع بازگشتی در پایتون آشنا شدیم و مثال‌های از آن را بررسی کردیم.

برای مطالعه بیشتر می‌توان موارد زیر را بررسی کرد:

  1. بیشترین دفعات ممکن برای Recursion
  2. اثر Recursion بر سرعت برنامه
  3. اثر حافظه و سرعت توابع بازگشتی
  4. مقایسه سرعت توابع بازگشتی با توابع معادل عادی
  5. ارتباط بین فراکتال‌ها (Fractals) و توابع بازگشتی
بر اساس رای ۱۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر پرسشی درباره این مطلب دارید، آن را با ما مطرح کنید.
منابع:
مجله فرادرس
PDF
مطالب مرتبط
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *