Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مقدمة في الاستدعاء الذاتي

جزء من قسم 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);       // الخطوة التكرارية
}

جرّب بنفسك

لا يتضمّن هذا الدرس تحدّيًا برمجيًا.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow