الدرس 25: أساسيات العودية (Recursion)
العودية هي العملية التي تقوم فيها الدالة باستدعاء نفسها، سواء بشكل مباشر أو غير مباشر.
القواعد الثلاث للعودية
- الحالة الأساسية (Base Case): يجب أن يكون هناك شرط يوقف الاستدعاء الذاتي. إذا فُقد هذا الشرط، فستستدعي الدالة نفسها إلى الأبد (مما يؤدي إلى تجاوز سعة المكدس - stack overflow).
- الخطوة العودية: يجب أن تستدعي الدالة نفسها.
- التقدم: يجب أن يتحرك الاستدعاء العودي نحو الحالة الأساسية (مثلاً عن طريق تقليل حجم المدخلات).
مثال: حساب المضروب (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).