0Pricing
C Academy · درس

الاستدعاء递ռقي مقابل التكرار

تعرّف على وقت اختيار كل منهما

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

طريقتان للتكرار

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

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

المضروب باستخدام حلقة

إليكم صيغة المضروب مكتوبة بصورة تكرارية باستخدام حلقة for. لا تستدعي الدالة نفسها؛ بل يجمع متغير واحد حاصل الضرب.

#include <stdio.h>

long factorial(int n) {
    long result = 1;
    for (int i = 2; i <= n; i++)
        result *= i;
    return result;
}

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

المضروب باستخدام العودية

النسخة العودية أقصر وتعكس التعريف الرياضي مباشرة.

تطبع كلتا النسختين 720 عند حساب factorial(6)، لكنهما تستخدمان آليتين مختلفتين.

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

اختلافات الذاكرة

يستخدم التكرار عادةً مقدارًا ثابتًا وصغيرًا من الذاكرة: بضعة متغيرات محلية فقط.

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

اختلافات السرعة

ينطوي كل استدعاء عودي على تكلفة صغيرة: إعداد إطار والعودة منه.

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

متى تتفوق العودية

تتألق العودية عندما تكون المسألة عودية بطبيعتها، مثل الأشجار والبنى المتداخلة أو خوارزميات التقسيم والتغلب.

في هذه الحالات، يكون الكود العودي أقصر وأوضح من الحلقة المكافئة التي تستخدم مكدسًا يدويًا.

متى يتفوق التكرار

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

كما أنها تتجنب أي خطر لحدوث تجاوز سعة المكدس مع المدخلات الكبيرة.

int sum_array(int a[], int n) {
    int total = 0;
    for (int i = 0; i < n; i++)
        total += a[i];
    return total;
}

المهمة نفسها، بأسلوبين

يمكن جمع الأعداد من 1 إلى n بالطريقتين. إليكم النسخة التكرارية التي تُرجع الإجابة نفسها التي تُرجعها العودية.

#include <stdio.h>

int sum_to(int n) {
    int total = 0;
    for (int i = 1; i <= n; i++)
        total += i;
    return total;
}

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

تحويل العودية إلى حلقة

يمكن إعادة كتابة أي عودية على شكل تكرار، باستخدام مكدس صريح خاص بكم أحيانًا.

تتحول العودية الخطية البسيطة، مثل المضروب أو الجمع، إلى حلقة عادية تستخدم متغيرًا جامعًا.

#include <stdio.h>

int main(void) {
    int n = 5, result = 1;
    while (n > 1) { result *= n; n--; }
    printf("%d\n", result);
    return 0;
}

ملاحظة حول العودية الذيلية

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

لا تضمن لغة C ذلك، لذا لا تعتمدوا عليه مع العودية العميقة.

int sum_tail(int n, int acc) {
    if (n == 0) return acc;
    return sum_tail(n - 1, acc + n);
}

اختيار الأسلوب

اسألوا أنفسكم: هل المسألة متداخلة بطبيعتها أو تعتمد على التقسيم والتغلب؟ عندها تلائمها العودية.

هل هي تكرار خطي بسيط مع احتمال وجود مدخلات ضخمة؟ عندها يكون التكرار أكثر أمانًا وغالبًا أسرع.

تحقق سريع

قارنوا بين الأسلوبين.

مراجعة

يمكن للعودية والتكرار حل المسائل نفسها. تستخدم الحلقات ذاكرة ثابتة وتناسب المهام الخطية، بينما تكون العودية أوضح في المسائل المتداخلة ومسائل التقسيم والتغلب، لكنها تستهلك إطار مكدس لكل استدعاء.

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

هل درس «الاستدعاء递ռقي مقابل التكرار» مجاني؟

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

ماذا ستتعلم في «الاستدعاء递ռقي مقابل التكرار»؟

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

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

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

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

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

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

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

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

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