ما هي البرمجة التكرارية؟
دالة تستدعي نفسها لحل مشكلة عن طريق تقسيمها لأجزاء أصغر. كل استدعاء يقترب من حالة توقف.
العناصر الأساسية
- الحالة الأساسية (base case): شرط التوقف — بدونها يتكرر البرنامج بلا نهاية.
- الحالة التكرارية (recursive case): الجزء الذي يستدعي نفسه بمعامل أصغر.
المثال الكلاسيكي: المضروب
static long factorial(int n) {
if (n <= 1) return 1; // الحالة الأساسية
return n * factorial(n - 1); // الحالة التكرارية
}
System.out.println(factorial(5)); // 120
مثال: فيبوناتشي
static int fibonacci(int n) {
if (n <= 0) return 0;
if (n == 1) return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
System.out.println(fibonacci(6)); // 8
مثال: مجموع مصفوفة
static int sum(int[] arr, int index) {
if (index < 0) return 0;
return arr[index] + sum(arr, index - 1);
}
int[] nums = {1, 2, 3, 4, 5};
System.out.println(sum(nums, nums.length - 1)); // 15
التكرارية مقابل الحلقات
| المقارنة | Recursion | حلقة |
|---|---|---|
| القوة | بسيطة لهياكل شجرية وفروع | أسرع عمليًا وأكثر وضوح للحلقات البسيطة |
| الذاكرة | كل استدعاء يحجز مكانًا على المكدّس | لا ذاكرة إضافية تقريبًا |
| خطر | تجاوز المكدّس (StackOverflowError) | لا يوجد هذا الخطر |
متى نستخدم Recursion؟
- هياكل شجرية: ملفات المجلدات، عُقد الـ Tree.
- خوارزميات فرعية: تقسيم وتسخير.
- فروع متعددة: فيبوناتشي، محاكاة.
⚠️ لا تستخدم recursion لمشاكل بسيطة يمكن حلها بحلقة — الـ recursion أقل أداءً بسبب تكلفة استدعاء الدالة المتكررة.
🎯 التالي: الترتيب والبحث في Java.