چه تفاوتی بین تابع بازگشتی و تابع معمولی وجود دارد

خلاصه
1404/05/27

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

چه تفاوتی بین تابع بازگشتی و تابع معمولی وجود دارد

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

* **توابع بازگشتی:** توابعی هستند که در تعریف خود، خودشان را فراخوانی می‌کنند. این فراخوانی تا زمانی ادامه پیدا می‌کند که به یک شرط پایانی (base case) برسیم و از فراخوانی مجدد جلوگیری شود.
* **توابع معمولی:** توابعی هستند که فقط کدهای داخل خود را اجرا می‌کنند و هیچ فراخوانی به خود ندارند.

در اینجا به بررسی دقیق‌تر تفاوت‌ها می‌پردازیم:

**1. فراخوانی:**

* **بازگشتی:** خود را فراخوانی می‌کند.
* **معمولی:** فقط یک بار و توسط بخش دیگری از کد فراخوانی می‌شود.

**2. شرط پایانی (Base Case):**

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

**3. پشته فراخوانی (Call Stack):**

* **بازگشتی:** هر بار که تابع خود را فراخوانی می‌کند، یک فریم جدید به پشته فراخوانی اضافه می‌شود. اگر شرط پایانی به درستی تعریف نشود، ممکن است پشته فراخوانی سرریز شود (Stack Overflow Error).
* **معمولی:** فقط یک فریم در پشته فراخوانی دارد (یا چند فریم اگر توابع دیگری را فراخوانی کند).

**4. پیچیدگی:**

* **بازگشتی:** درک و دیباگ کردن توابع بازگشتی ممکن است دشوارتر باشد، به خصوص اگر به درستی طراحی نشده باشند.
* **معمولی:** معمولاً درک و دیباگ کردن توابع معمولی آسان‌تر است.

**5. کارایی:**

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

**6. کاربردها:**

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

**مثال:**

**تابع بازگشتی (محاسبه فاکتوریل):**

```python
def factorial_recursive(n):
if n == 0: # شرط پایانی
return 1
else:
return n * factorial_recursive(n-1)
```

**تابع معمولی (محاسبه فاکتوریل):**

```python
def factorial_iterative(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
```

**چه زمانی از توابع بازگشتی استفاده کنیم؟**

* وقتی مسئله به طور طبیعی به مسائل کوچک‌تر و مشابه تقسیم می‌شود.
* وقتی کد با توابع بازگشتی خواناتر و مختصرتر می‌شود.

**چه زمانی از توابع معمولی استفاده کنیم؟**

* وقتی کارایی مهم است.
* وقتی مسئله را می‌توان به طور مستقیم و بدون استفاده از بازگشت حل کرد.

**نکات مهم:**

* همیشه یک شرط پای