اذهب إلى المحتوى
  • 0

خطأ RecursionError: maximum recursion depth exceeded in comparison

السؤال

نشر

أحاول أن أقوم بعمل حلقة تكرار عن طريق دالة تكرارية recursive function لكن بعد فترة من التشغيل (بالضبط في الفهرس index رقم 997) يظهر لي الخطأ التالي:

RecursionError: maximum recursion depth exceeded in comparison

ما سبب هذا الخطأ وكيف أقوم بإصلاحه؟

Recommended Posts

  • 1
نشر

هناك منطقة في الذاكرة memory تسمى بالتكدس Stack وهي خاصة بمتابعة سجل إستدعاء الدوال function calls ، فعلى سبيل المثال في دالتك التكرارية عند إستدعائها يتم تسجيلها في التكديس stack وعندما تقوم بإستدعائها مرة أخرى يتم تسجيل بشكل مكّدس يعني فوق الاستدعاء السابق function call وهكذا عند إستدعاء أي دالة يتم تكديسها فوق السابق وعندما الدالة تنتهي من عملها يتم إزالتها من التكديس والعودة الى الدالة الآخرى الذي قبلها وهكذا

لكن الذاكرة memory محدودة ولها سجل تكديس محدود فعندما تتجاوز هذا الحد فإن هذا يؤدي الى فشل البرنامج وتسمى هذه المشكلة ب stack overflow لهذا لغة python قامت بوضع حد إفتراضي وهو 997 لكي لا تصل الى stack overflow ويمكنك تجاوز الحد الإفتراضي ولكن هذا خطر لأنك قد تتجاوز الحد النهائي ، وهذا الكود لتجاوز الحد الإفتراضي

import sys
sys.setrecursionlimit(1200) # هنا تقوم بتغيير الحد الإفتراضي 

لهذا إذا كانت الدالة تتجاوز الحد النهائي فيمكنك إستخدام الحلقات loops بدلاً من الدوال التكرارية recursive functions

  • 1
نشر

المشكلة أنك لم تقم بوضع شرط توقف على الاستدعاء العودي وبالتالي تدخل في تكرار لانهائي من الاستدعائات حتى تمتلئ الذاكرة فيظهر لك الخطأ.
مثال: هنا عرفنا تابع يقوم بحساب العاملي لعدد ما اعتماداً على العودية.

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)  # هنا سيستمر الاستدعاء إلى مالانهاية وبالتالي تمتلئ الذاكرة ويتوقف البرنامج

أي يجب دوماً وضع شرط يتم من خلاله إيقاف الاستدعاء العودي.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...