مقدمة في الاستدعاء الذاتي
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 45 من 56.
العودية (Recursion) هي تقنية برمجية تستدعي فيها الدالة نفسها لحل مشكلة ما. وبدلاً من استخدام الحلقات التكرارية (loops)، تقوم الدوال العودية بتفكيك المشكلات المعقدة إلى مشكلات فرعية أصغر ومتشابهة حتى تصل إلى حالة بسيطة يمكن حلها مباشرة.
يجب أن تحتوي كل دالة عودية على مكونين أساسيين. الحالة الأساسية هي شرط يوقف العودية - فبدونها، ستستدعي الدالة نفسها إلى الأبد. الخطوة العودية هي الجزء الذي تستدعي فيه الدالة نفسها بمعاملات معدلة، لتنتقل بشكل أقرب إلى الحالة الأساسية مع كل استدعاء.
إليك مثال بسيط للعد التنازلي يوضح العودية (recursion):
void countdown(int n) {
if (n <= 0) { // الحالة الأساسية: التوقف عندما تصل n إلى 0
std::cout << "Done!" << std::endl;
return;
}
std::cout << n << std::endl;
countdown(n - 1); // الخطوة العودية: الاستدعاء بـ n-1
}عندما تستدعي countdown(3)، فإنه يطبع 3، ثم يستدعي countdown(2)، الذي يطبع 2، ثم يستدعي countdown(1)، وهكذا حتى يصل إلى الحالة الأساسية. كل استدعاء للدالة ينتظر اكتمال الاستدعاء التالي قبل الانتهاء، مما يؤدي إلى إنشاء سلسلة من الاستدعاءات التي تعود في النهاية إلى المستدعي الأصلي.
ورقة مرجعية
التكرار (Recursion) هو عندما تقوم دالة باستدعاء نفسها لحل مشكلة ما عن طريق تقسيمها إلى مشكلات فرعية أصغر.
تحتاج كل دالة تكرارية إلى:
- الحالة الأساسية (Base case): الشرط الذي يوقف التكرار
- الخطوة التكرارية (Recursive step): تستدعي الدالة نفسها بمعاملات معدلة
مثال على دالة العد التنازلي (countdown):
void countdown(int n) {
if (n <= 0) { // الحالة الأساسية
std::cout << "Done!" << std::endl;
return;
}
std::cout << n << std::endl;
countdown(n - 1); // الخطوة التكرارية
}جرّب بنفسك
لا يتضمّن هذا الدرس تحدّيًا برمجيًا.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات4الخرائط (أزواج مفتاح-قيمة)
مقدمة إلى std::mapإنشاء خريطةالوصول إلى القيم وتعديلهاالتحقق من وجود المفاتيححذف الأزواجالتكرار عبر الخريطةمراجعة - تكرار الكلمات7الدوال المتقدمة
التمرير بالمرجعمقدمة في تعبيرات Lambdaتعبيرات Lambda مع المعاملاتتعبيرات Lambda مع قيم الإرجاعمقدمة في الاستدعاء الذاتيالمضروب بالاستدعاء الذاتيالفرز باستخدام Lambda2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector