python - شرح - recursion examples java



بيثون ماكس ريكورسيون، كيستيون أبوت sys.setrecursionlimit() (2)

لدي سؤال واحد حول sys.setrecursionlimit ()

من ثعبان الوثيقة هذه الوظيفة:

اضبط الحد األقصى لعمق مترجم مترجم بايثون للحد. هذا الحد يمنع عودية لانهائية من التسبب في تجاوز كومة C وتحطمها بيثون. وأعلى حد ممكن يعتمد على النظام الأساسي. قد يحتاج المستخدم إلى تعيين الحد الأعلى عندما يكون لديه برنامج يتطلب التكرار العميق ومنصة تدعم حد أعلى. وينبغي أن يتم ذلك بعناية، لأن حد مرتفع جدا يمكن أن يؤدي إلى تحطم الطائرة.

وهنا سؤالي:

دعونا نأخذ هذه الوظيفة عودية عديمة الفائدة:

def rec(N):
     if N==0:
         return 1
     else:
         return rec(N-1);

الآن دعونا تعيين الحد الأقصى للعودة إلى 100:

sys.setrecursionlimit(100)

إذا حاولت rec(99) (100 المكالمات المتكررة)، أحصل على:

RuntimeError: maximum recursion depth exceeded

لحساب ريك (99) ولست بحاجة إلى تعيين حد العودية إلى 105

لماذا هو كذلك ؟

https://src-bin.com


Answer #1

انها سيئة اسمه. وينبغي أن أقول مكدس العمق، وليس عمق العودية. ريكورسيون يعني أنه نفس الموضوع مرارا وتكرارا أنه محدد. في الواقع، هل يمكن أن يكون رمز الفعلي الذي يدعو فقط 100 عميق. أنا لا أنصح به، ولكن هل يمكن. يمكن أن تحصل على بعيدا معها لأنه في العالم العملي، الأوقات الوحيدة التي واجهت أي وقت مضى في هذا السيناريو هو مع التكرار. عندما تحطم بسبب هذا، رؤية كلمة "ريكورسيون" يعطيك فكرة فورية من ما للبحث عنه بدلا من "كومة".

(كومة يجب أن تعطي أي مبرمج لائق نفس فكرة، ولكن دعونا نكون صادقين، التعليمات البرمجية الخاصة بك تحطمت فقط وتريد رسالة خطأ ذات الصلة، أليس كذلك؟ 99.99999٪ من الوقت هذا يخبرك بالضبط ما خبطت (كنت غاب عن القضية الأساسية ل العودية.))


Answer #2

لأنه يقوم على عمق توتال كومة وليس حقا عمق أي وظيفة واحدة معينة. ربما كنت بالفعل في عمق كومة من 5 عند إجراء المكالمة الأولى ل ريك ().

خذ على سبيل المثال 5 وظائف العودية. كل يجعل 98 المكالمات المتكررة مع آخر واحد إلى وظيفة العودية القادمة. مع حد العودية من 100 هل تريد حقا أن تسمح لكل وظيفة العودية لجعل 99 المكالمات لعمق الكلي من ~ 500 المكالمات؟ لا، قد يحطم ذلك المترجم عند تلك الأعماق.

ولذلك فإن حد العودية هو أقصى عمق لجميع الوظائف على الصعيد العالمي، وليس أي وظيفة واحدة المسماة.





recursion