Adam Ebrahim نشر 8 يونيو 2021 أرسل تقرير مشاركة نشر 8 يونيو 2021 أحاول أن أقوم بعمل حلقة تكرار عن طريق دالة تكرارية recursive function لكن بعد فترة من التشغيل (بالضبط في الفهرس index رقم 997) يظهر لي الخطأ التالي: RecursionError: maximum recursion depth exceeded in comparison ما سبب هذا الخطأ وكيف أقوم بإصلاحه؟ 1 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
1 عبدالله عبدالرحمن11 نشر 8 يونيو 2021 أرسل تقرير مشاركة نشر 8 يونيو 2021 هناك منطقة في الذاكرة memory تسمى بالتكدس Stack وهي خاصة بمتابعة سجل إستدعاء الدوال function calls ، فعلى سبيل المثال في دالتك التكرارية عند إستدعائها يتم تسجيلها في التكديس stack وعندما تقوم بإستدعائها مرة أخرى يتم تسجيل بشكل مكّدس يعني فوق الاستدعاء السابق function call وهكذا عند إستدعاء أي دالة يتم تكديسها فوق السابق وعندما الدالة تنتهي من عملها يتم إزالتها من التكديس والعودة الى الدالة الآخرى الذي قبلها وهكذا لكن الذاكرة memory محدودة ولها سجل تكديس محدود فعندما تتجاوز هذا الحد فإن هذا يؤدي الى فشل البرنامج وتسمى هذه المشكلة ب stack overflow لهذا لغة python قامت بوضع حد إفتراضي وهو 997 لكي لا تصل الى stack overflow ويمكنك تجاوز الحد الإفتراضي ولكن هذا خطر لأنك قد تتجاوز الحد النهائي ، وهذا الكود لتجاوز الحد الإفتراضي import sys sys.setrecursionlimit(1200) # هنا تقوم بتغيير الحد الإفتراضي لهذا إذا كانت الدالة تتجاوز الحد النهائي فيمكنك إستخدام الحلقات loops بدلاً من الدوال التكرارية recursive functions 2 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
1 Ali Haidar Ahmad نشر 8 يونيو 2021 أرسل تقرير مشاركة نشر 8 يونيو 2021 المشكلة أنك لم تقم بوضع شرط توقف على الاستدعاء العودي وبالتالي تدخل في تكرار لانهائي من الاستدعائات حتى تمتلئ الذاكرة فيظهر لك الخطأ. مثال: هنا عرفنا تابع يقوم بحساب العاملي لعدد ما اعتماداً على العودية. def factorial(x): if x == 1: # عملياً هنا سوف يتوقف الاستدعاء العودي return 1 else: return (x * factorial(x-1)) # هنا يتم الاستدعاء العودي print("The factorial of", 8, "is", factorial(8)) مثال: # تابع تمرر له عدد ويقوم بتصفيره def RecursiveFunction (y): y=y-1 return RecursiveFunction(y); # وبالتالي لم نضع شرط توقف RecursiveFunction (10) # هنا سيستمر الاستدعاء إلى مالانهاية وبالتالي تمتلئ الذاكرة ويتوقف البرنامج ############################ التصحيح بأن نضع شرط توقف ################ def RecursiveFunction (y): if y==0: return "Done" y=y-1 return RecursiveFunction(y); # وبالتالي لم نضع شرط توقف RecursiveFunction (10) # هنا سيستمر الاستدعاء إلى مالانهاية وبالتالي تمتلئ الذاكرة ويتوقف البرنامج أي يجب دوماً وضع شرط يتم من خلاله إيقاف الاستدعاء العودي. 2 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
0 محمد أبو عواد نشر 8 يونيو 2021 أرسل تقرير مشاركة نشر 8 يونيو 2021 سبب هذا الخطأ حدوث تجاوزات في المكدس, ويظهر هذا الخطأ كحارس ضد تجاوز المكدس, لحل المشكلة حاول فعل التالي import sys sys.setrecursionlimit(1500) 1 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
السؤال
Adam Ebrahim
أحاول أن أقوم بعمل حلقة تكرار عن طريق دالة تكرارية recursive function لكن بعد فترة من التشغيل (بالضبط في الفهرس index رقم 997) يظهر لي الخطأ التالي:
RecursionError: maximum recursion depth exceeded in comparison
ما سبب هذا الخطأ وكيف أقوم بإصلاحه؟
رابط هذا التعليق
شارك على الشبكات الإجتماعية
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.