العودة إلى الدورة

أساسيات العودية (Recursion)

لغة C: من الصفر إلى الاحتراف - الدليل الشامل للمبتدئين

الدرس 25: أساسيات العودية (Recursion)

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

القواعد الثلاث للعودية

  1. الحالة الأساسية (Base Case): يجب أن يكون هناك شرط يوقف الاستدعاء الذاتي. إذا فُقد هذا الشرط، فستستدعي الدالة نفسها إلى الأبد (مما يؤدي إلى تجاوز سعة المكدس - stack overflow).
  2. الخطوة العودية: يجب أن تستدعي الدالة نفسها.
  3. التقدم: يجب أن يتحرك الاستدعاء العودي نحو الحالة الأساسية (مثلاً عن طريق تقليل حجم المدخلات).

مثال: حساب المضروب (Factorial)

مضروب العدد $N$ ($N!$) هو حاصل ضرب جميع الأعداد الصحيحة الموجبة الأقل من أو تساوي $N$. ($5! = 5 \times 4 \times 3 \times 2 \times 1$).

الحالة الأساسية: $0! = 1$. الخطوة العودية: $N! = N \times (N-1)!$

c #include <stdio.h>

long int factorial(int n) { // 1. الحالة الأساسية: توقف العودية if (n == 0 || n == 1) { return 1; } // 2. الخطوة العودية (التحرك نحو الحالة الأساسية) return n * factorial(n - 1); }

int main() { printf("مضروب 5 هو %ld\n", factorial(5)); // المخرجات: 120 return 0; }

مزايا وعيوب العودية

  • المزايا: حلول أنيقة ومختصرة للمشاكل التي يتم تعريفها بشكل طبيعي بالعودية (مثل التنقل في الأشجار أو بعض المتواليات الرياضية).
  • العيوب: استهلاك أكبر للذاكرة والوقت مقارنة بالحلول التكرارية بسبب إدارة مكدس استدعاء الدوال (function call stack).