0Pricing
C Academy · درس

مسائل递归ية كلاسيكية

المضروب ومتتالية Fibonacci

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

مسائل كلاسيكية

تتناسب بعض المسائل طبيعيًا مع الاستدعاء الذاتي. ويمنحكم تعلم المسائل الكلاسيكية أنماطًا يمكنكم إعادة استخدامها.

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

المضروب

مضروب n هو n مضروبًا في مضروب n ناقص 1، مع اعتبار 1! مساويًا لـ 1.

هذا هو الاستدعاء الذاتي بصورته التعليمية: حالة أساس واضحة واستدعاء ذاتي واحد.

#include <stdio.h>

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

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

أعداد Fibonacci

كل عدد من أعداد Fibonacci هو مجموع العددين السابقين له. ويحتاج التعريف التكراري إلى حالتي أساس: fib(0)=0 وfib(1)=1.

تجري هذه النسخة استدعاءين في كل خطوة.

int fib(int n) {
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
}

تشغيل Fibonacci

إليكم البرنامج الكامل. ينبغي أن يطبع fib(10) القيمة 55.

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

#include <stdio.h>

int fib(int n) {
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
}

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

مجموع الأرقام

لجمع أرقام عدد، خذوا الرقم الأخير باستخدام n % 10، ثم أجروا استدعاءً ذاتيًا على الجزء المتبقي باستخدام n / 10.

تكون حالة الأساس عند وصول n إلى 0.

int digit_sum(int n) {
    if (n == 0) return 0;
    return (n % 10) + digit_sum(n / 10);
}

تطبيق مجموع الأرقام

بالنسبة إلى 1234، يكون المجموع 1+2+3+4 = 10. لنتحقق من ذلك باستخدام برنامج كامل.

#include <stdio.h>

int digit_sum(int n) {
    if (n == 0) return 0;
    return (n % 10) + digit_sum(n / 10);
}

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

القاسم المشترك الأكبر

تتناسب خوارزمية إقليدس طبيعيًا مع الاستدعاء الذاتي. فالقاسم المشترك الأكبر للعددين a وb يساوي القاسم المشترك الأكبر للعددين b وa % b.

عندما تصبح b مساوية لـ 0، تكون a هي الإجابة.

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

برنامج كامل للقاسم المشترك الأكبر

القاسم المشترك الأكبر للعددين 48 و18 هو 6. يطبع هذا البرنامج هذه القيمة.

#include <stdio.h>

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

int main(void) {
    printf("%d\n", gcd(48, 18));
    return 0;
}

عكس عدد

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

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

#include <stdio.h>

void print_digits(int n) {
    if (n == 0) return;
    print_digits(n / 10);
    printf("%d ", n % 10);
}

int main(void) {
    print_digits(729);
    printf("\n");
    return 0;
}

دالة القوة

رفع أساس إلى أس يندرج أيضًا ضمن العمليات العودية: ‏base^exp يساوي base مضروبًا في ‏base^(exp-1).

الحالة الأساسية هي الأس 0، وتُرجع القيمة 1.

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

أنماط ستعيدون استخدامها

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

ما إن تكتشفوا هذا النمط، حتى تصبح كثير من المسائل دوال عودية قصيرة.

تحقق سريع

اختاروا الحالات الأساسية الصحيحة.

مراجعة

تشترك المضروب، ومتتالية Fibonacci، ومجموع الأرقام، والقاسم المشترك الأكبر، والقوة في نمط عودي واحد: معالجة الحالة الأساسية، ثم دمج القيمة الحالية مع مسألة فرعية أصغر.

يمكن تطبيق هذه القوالب على العديد من المهام الأخرى.

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

هل درس «مسائل递归ية كلاسيكية» مجاني؟

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

ماذا ستتعلم في «مسائل递归ية كلاسيكية»؟

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

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

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

كم من الوقت يستغرق درس «مسائل递归ية كلاسيكية»؟

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

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

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

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

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