0Pricing
C Academy · درس

كيف يعمل الاستدعاء递归ي

حالات الأساس ومكدس الاستدعاء

كيف يعمل الاستدعاء递归ي درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

ما المقصود بالاستدعاء الذاتي؟

الاستدعاء الذاتي هو أن تستدعي الدالة نفسها لحل مشكلة. ويتعامل كل استدعاء مع جزء أصغر من المشكلة الأصلية.

في لغة C، يمكن لأي دالة استدعاء نفسها، ما دام هناك سبيل لإيقاف هذه الاستدعاءات في النهاية.

حالة الأساس

تحتاج كل دالة ذات استدعاء ذاتي إلى حالة أساس، وهي شرط تتوقف عنده عن استدعاء نفسها وتعيد النتيجة مباشرةً.

من دون حالة أساس، ستستدعي الدالة نفسها إلى ما لا نهاية وسينهار البرنامج.

int countdown(int n) {
    if (n == 0) return 0; /* base case */
    return countdown(n - 1);
}

الحالة التكرارية

الحالة التكرارية هي الجزء الذي تستدعي فيه الدالة نفسها باستخدام وسيط مُغيَّر.

يجب أن يقترب هذا الوسيط من حالة الأساس، وإلا فلن ينتهي الاستدعاء الذاتي.

int sum_to(int n) {
    if (n == 0) return 0;       /* base case */
    return n + sum_to(n - 1);   /* recursive case */
}

أول برنامج متكامل

لنشغّل برنامجًا كاملًا يجمع الأعداد من 1 إلى 5 باستخدام الاستدعاء الذاتي.

ينبغي أن تكون النتيجة 15.

#include <stdio.h>

int sum_to(int n) {
    if (n == 0) return 0;
    return n + sum_to(n - 1);
}

int main(void) {
    printf("%d\n", sum_to(5));
    return 0;
}

تتبّع الاستدعاءات

من المفيد تتبّع الاستدعاء الذاتي يدويًا. بالنسبة إلى sum_to(3):

sum_to(3) = 3 + sum_to(2)
sum_to(2) = 2 + sum_to(1)
sum_to(1) = 1 + sum_to(0)
sum_to(0) = 0

ثم تعود الاستدعاءات إلى الأعلى: 1، ثم 3، ثم 6.

مكدس الاستدعاءات

يحصل كل استدعاء لدالة على مساحة خاصة به في مكدس الاستدعاءات، وتحتوي هذه المساحة على وسائطه ومتغيراته المحلية.

أثناء التعمق، تتراكم إطارات الاستدعاء. وعند عودة الاستدعاء، يُزال إطاره وتعود السيطرة إلى الدالة المستدعية.

التمدد والانكماش

يمر الاستدعاء الذاتي بمرحلتين. يحدث التمدد عندما تستمر الاستدعاءات في التعمق باتجاه حالة الأساس.

أما الانكماش فيحدث عندما تعود حالة الأساس، وينهي كل استدعاء عمله باستخدام القيمة المعادة.

#include <stdio.h>

int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

int main(void) {
    printf("%d\n", factorial(4));
    return 0;
}

تعود القيم المعادة إلى الأعلى

تستخدم الاستدعاءَ الأعمقَ القيمةَ التي أعادها الاستدعاءُ الذي أنشأه.

لهذا السبب يهم الترتيب: ينتهي الاستدعاء الأعمق أولًا، ثم تتحد النتائج أثناء العودة إلى أعلى المكدس.

int power(int base, int exp) {
    if (exp == 0) return 1;
    return base * power(base, exp - 1);
}

الطباعة أثناء الاستدعاء الذاتي

يمكنكم الطباعة قبل الاستدعاء الذاتي أو بعده. تُظهر الطباعة قبل الاستدعاء الأرقام أثناء النزول، بينما تُظهر الطباعة بعده الأرقام أثناء الصعود.

#include <stdio.h>

void down(int n) {
    if (n == 0) return;
    printf("%d ", n);
    down(n - 1);
}

int main(void) {
    down(5);
    printf("\n");
    return 0;
}

الطباعة أثناء الصعود

انقلوا printf إلى ما بعد الاستدعاء الذاتي، وسينعكس الترتيب. إذ ستطبع أعمق استدعاءة أولًا.

سيطبع هذا البرنامج 1 2 3 4 5 بدلًا من 5 4 3 2 1.

#include <stdio.h>

void up(int n) {
    if (n == 0) return;
    up(n - 1);
    printf("%d ", n);
}

int main(void) {
    up(5);
    printf("\n");
    return 0;
}

قاعدتان يجب تذكرهما

تتبع الدالة ذات الاستدعاء الذاتي الصحيحة قاعدتين:

1. تحتوي على حالة أساس واحدة على الأقل تعيد النتيجة من دون استدعاء ذاتي.
2. يقرّب كل استدعاء ذاتي الوسيط من حالة أساس.

يؤدي خرق أي من القاعدتين إلى دوران البرنامج بلا نهاية.

تحقق سريع

اختبروا فهمكم لأساسيات الاستدعاء الذاتي.

مراجعة

يحل الاستدعاء الذاتي المشكلة باستدعاء الدالة نفسها مع إدخال أصغر. وتحتاجون دائمًا إلى حالة أساس للإيقاف، وحالة تكرارية تقترب منها.

يستخدم كل استدعاء إطارًا في المكدس، وتعود النتائج أثناء انكماش الاستدعاءات.

الأسئلة الشائعة

هل درس «كيف يعمل الاستدعاء递归ي» مجاني؟

نعم — نص درس «كيف يعمل الاستدعاء递归ي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «كيف يعمل الاستدعاء递归ي»؟

حالات الأساس ومكدس الاستدعاء تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «كيف يعمل الاستدعاء递归ي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. كيف يعمل الاستدعاء递归ي
  2. مسائل递归ية كلاسيكية
  3. الاستدعاء递ռقي مقابل التكرار
  4. تجنّب Stack Overflow
← العودة إلى C Academy