التفكير递归يًا: الحالة الأساسية والاستدعاء递归ي
تقسيم المسألة إلى نسخ أصغر منها
التفكير递归يًا: الحالة الأساسية والاستدعاء递归ي درس مجاني في Competitive Programming Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Competitive Programming Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
ما المقصود بالاستدعاء الذاتي
الاستدعاء الذاتي هو أن تحل الدالة مسألةً باستدعاء نفسها على جزء أصغر، حتى يصبح الجزء صغيرًا بما يكفي للإجابة عنه مباشرةً. 🌀
ثق بالنسخة الأصغر
الفكرة الأساسية هي قفزة الثقة: افترض أن الاستدعاء الذاتي يعمل بالفعل على المدخل الأصغر، ثم ابنِ إجابتك اعتمادًا عليه.
كل استدعاء ذاتي يحتاج إلى حالة أساسية
الحالة الأساسية هي أصغر مدخل تجيب عنه من دون استدعاء ذاتي. ومن دونها، تستدعي الدالة نفسها إلى الأبد وتتسبب في انهيار البرنامج.
الحالة التكرارية
تقلل الحالة التكرارية حجم المسألة وتستدعي الدالة نفسها على النسخة الأصغر. ويجب أن يقرّب كل استدعاء المسألة من الحالة الأساسية.
العاملية كمثال أول
تُظهر factorial هنا الجزأين معًا: حالة أساسية عند الصفر واستدعاءً ذاتيًا لـ n ناقص واحد.
def fact(n):
if n == 0:
return 1
return n * fact(n - 1)كيف يعمل مكدس الاستدعاءات
ينتظر كل استدعاء في مكدس الاستدعاءات حتى يعود الاستدعاء الداخلي. ينتهي الاستدعاء الأعمق أولًا، ثم تتتابع النتائج عائدةً إلى الأعلى.
راقبوا عمق الاستدعاء الذاتي
تحدّ Python عمق الاستدعاء الذاتي افتراضيًا بنحو 1000. وتحتاج الاستدعاءات الذاتية العميقة في المسابقات إلى sys.setrecursionlimit لتجنب خطأ وقت التشغيل.
import sys
sys.setrecursionlimit(300000)أحرزوا تقدمًا في كل استدعاء
يُقلّص الاستدعاء الذاتي الصحيح الإدخال دائمًا باتجاه الحالة الأساسية. وإذا عاد في أي وقت إلى الحجم نفسه، فسيدخل في حلقة لا نهائية. ⚠️
اجمعوا قائمة باستدعاء ذاتي
يفصل هذا الجمع بالاستدعاء الذاتي العنصر الأول، ثم يعتمد على الاستدعاء لإضافة بقية القائمة.
def total(a):
if not a:
return 0
return a[0] + total(a[1:])تُظهر أشجار الاستدعاء الذاتي التفرع
عندما تُجري دالة أكثر من استدعاء واحد، يتشكل العمل على هيئة شجرة استدعاء ذاتي. ويحدد حجمها الكلفة الإجمالية.
قد يؤدي تكرار العمل إلى البطء
تعيد خوارزمية Fibonacci الساذجة حساب القيم نفسها مرارًا، مما يؤدي إلى زمن أسي. ويحل تخزين تلك النتائج مؤقتًا المشكلة فورًا.
تحقق سريع
ماذا يحدث إذا لم تملك دالة ذاتية الاستدعاء حالةً أساسية؟
مراجعة: جزآن وفكرة واحدة
تعلّمتم أن الاستدعاء الذاتي يحتاج إلى حالة أساسية للتوقف، وإلى حالة استدعاء ذاتي تُقلّص الإدخال. اعتمدوا على الاستدعاء الأصغر، وسيتبع ذلك كل شيء. 🎯
الأسئلة الشائعة
هل درس «التفكير递归يًا: الحالة الأساسية والاستدعاء递归ي» مجاني؟
نعم — نص درس «التفكير递归يًا: الحالة الأساسية والاستدعاء递归ي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Competitive Programming Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
ماذا ستتعلم في «التفكير递归يًا: الحالة الأساسية والاستدعاء递归ي»؟
تقسيم المسألة إلى نسخ أصغر منها تتمرن على Competitive Programming Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Competitive Programming Academy؟
لا تُشترط خبرة سابقة. Competitive Programming Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التفكير递归يًا: الحالة الأساسية والاستدعاء递归ي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Competitive Programming Academy هذا؟
نعم. كل درس في Competitive Programming Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التفكير递归يًا: الحالة الأساسية والاستدعاء递归ي
- توليد جميع المجموعات الجزئية
- التباديل وفكرة N-Queens
- التقليم للنجاة من الحد الزمني