تكرار السؤال: …
الإجابة المختصرة
لكل استدعاء stack frame، والحد الافتراضي لعمق الاستدعاء حوالي 1000، ولا تدعم Python تحسين tail-call؛ لذلك الحلقة أو stack صريح أنسب للبيانات العميقة.
الشرح
عند تجاوز الحد ترمي Python استثناء RecursionError. رفع الحد عبر sys.setrecursionlimit بشكل أعمى قد يسبب انهيار العملية بسبب امتلاء C stack. استخدم الاستدعاء التعاودي عندما يكون العمق صغيرًا ومحدودًا ويبسّط الكود (مثل التنقل في شجرة متوازنة)، وحوّله إلى حلقة مع stack صريح في الهياكل التي قد تكون عميقة جدًا. ويمكن لـ functools.cache تحسين الاستدعاءات المتكررة لكنها لا تحل مشكلة العمق.
مثال بالكود
def walk(root):
stack = [root]
while stack: # بدون حد لعمق الاستدعاء
node = stack.pop()
yield node
stack.extend(reversed(node.children))أخطاء شائعة
- رفع recursionlimit إلى قيمة ضخمة لإخفاء مشكلة تصميم.
- افتراض أن Python تحسّن tail recursion كما في بعض اللغات الوظيفية.