بازگشت پیشرفته
بازگشت پیشرفته: درخت بازگشت، شمارش شاخهها، تحلیل عمق و تبدیل سیستماتیک به تکراری
بازگشت بهعنوان درخت
هر فراخوانی بازگشتی = یک گره در درخت بازگشت. تحلیل این درخت، کلید فهم الگوریتمهای بازگشتی است:
- عمق درخت = عمق بازگشت = حافظه پشته
- تعداد گرهها = تعداد کل فراخوانیها = زمان
- پهنای هر گره = تعداد انتخابها در آن نقطه
مثال: درخت فیبوناچی
fib(4)
├── fib(3)
│ ├── fib(2)
│ │ ├── fib(1) ✓
│ │ └── fib(0) ✓
│ └── fib(1) ✓
└── fib(2)
├── fib(1) ✓
└── fib(0) ✓
۹ گره برای fib(4)! رشد نمایی — و انگیزه memoization.
سه نوع الگوی بازگشت
| الگو | شکل | مثال |
|---|---|---|
| خطی | یک فراخوانی | فاکتوریل، پیمایش لیست |
| دو فراخوانی | فیبوناچی، پیمایش درخت | |
| حلقه فراخوانی | Backtracking، جستجوی همه حالتها |
بازگشت با انباشت (Accumulator)
بهجای جمعکردن نتایج در بازگشت، نتیجه جزئی را پارامتر پاس بدهید — عمقاً به تکراری شبیهتر و سریعتر:
# بازگشتی معمولی
def sum_rec(arr, i):
if i == len(arr): return 0
return arr[i] + sum_rec(arr, i + 1)
# با انباشت
def sum_acc(arr, i, acc=0):
if i == len(arr): return acc
return sum_acc(arr, i + 1, acc + arr[i])
تبدیل سیستماتیک به تکراری
- پشته صریح بساز و ریشه را بگذار
- تا خالیشدن پشته: گره بردار، پردازش کن، فرزندان را بگذار
هر الگوریتم بازگشتی اینطور تبدیل میشود — DFS تکراری دقیقاً همین است!
نکته: پایتون حد بازگشت ~۱۰۰۰ دارد (RecursionError). برای داده بزرگ، یا تکراری بنویسید یا sys.setrecursionlimit — اما دومی خطرناک است (سرریز واقعی حافظه C!).
جمعبندی
- بازگشت = درخت؛ عمق = حافظه، گرهها = زمان
- سه الگو: خطی، دوگانه، دستهای
- انباشت: نتیجه در پارامتر — سریعتر
- تبدیل تکراری: پشته صریح — همیشه ممکن
این مبحث بخشی از دوره آموزش کامل الگوریتمها است.