الدوال العودية
جزء من قسم Logic & Flow في رحلة PHP على Coddy — الدرس 8 من 68.
العودية (Recursion) هي تقنية برمجية تقوم فيها الدالة باستدعاء نفسها لحل مشكلة ما. يؤدي هذا إلى إنشاء سلوك يشبه الحلقة، ولكن بدلاً من استخدام الحلقات التقليدية، تقوم الدالة باستدعاء نفسها بشكل متكرر بمعاملات معدلة حتى تصل إلى حل.
كل دالة عودية (recursive function) يجب أن تحتوي على مكونين أساسيين لتعمل بشكل صحيح:
الحالة الأساسية: هذا هو الشرط الذي يوقف التكرار (العودية). بدونه، ستستدعي الدالة نفسها بشكل لا نهائي، مما يتسبب في تعطل برنامجك. تحدد الحالة الأساسية متى يجب أن تعيد الدالة نتيجة بدلاً من استدعاء نفسها مرة أخرى.
الخطوة العودية: هذا هو المكان الذي تستدعي فيه الدالة نفسها بنسخة معدلة من المشكلة الأصلية، مما يقربها تدريجياً من الحالة الأساسية.
إليك مثال بسيط لدالة عودية تحسب المضروب (factorial):
<?php
function factorial($n) {
// الحالة الأساسية: مضروب 1 هو 1
if ($n <= 1) {
return 1;
}
// الخطوة العودية: n! = n * (n-1)!
return $n * factorial($n - 1);
}
echo factorial(5); // المخرجات: 120
?>في هذا المثال، يستدعي factorial(5) الدالة factorial(4)، والتي تستدعي factorial(3)، وهكذا، حتى يصل إلى factorial(1) (الحالة الأساسية). ثم تُضرب النتائج تصاعدياً: 1 × 2 × 3 × 4 × 5 = 120.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلقم بإنشاء دالة تكرارية (recursive function) تسمى sumDigits تأخذ عدداً صحيحاً موجباً وتعيد مجموع أرقامه. يجب أن تستخدم الدالة التكرار لتقسيم الرقم رقماً تلو الآخر.
ستتلقى مدخلاً واحداً: عدد صحيح موجب. اقرأ المدخل، واستدعِ دالتك التكرارية بهذا الرقم، ثم اطبع مجموع أرقامه.
تنسيق المدخلات: سطر واحد يحتوي على عدد صحيح موجب
المخرجات المتوقعة: مجموع كل الأرقام المكونة للعدد
ورقة مرجعية
العودية (Recursion) هي تقنية برمجية تستدعي فيها الدالة نفسها لحل مشكلة ما. تحتاج كل دالة عودية إلى مكونين:
الحالة الأساسية (Base Case): الشرط الذي يوقف العودية لمنع الحلقات اللانهائية.
الخطوة العودية (Recursive Step): حيث تستدعي الدالة نفسها بمعاملات معدلة، متجهة نحو الحالة الأساسية.
مثال على دالة المضروب (factorial) العودية:
<?php
function factorial($n) {
// الحالة الأساسية: مضروب 1 هو 1
if ($n <= 1) {
return 1;
}
// الخطوة العودية: n! = n * (n-1)!
return $n * factorial($n - 1);
}
echo factorial(5); // المخرجات: 120
?>جرّب بنفسك
<?php
// قراءة المدخلات
$number = intval(fgets(STDIN));
// TODO: قم بإنشاء دالة sumDigits العودية هنا
// استدعاء الدالة وطباعة النتيجة
echo sumDigits($number);
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1الدوال المتقدمة
الدوال المجهولةالـ Closures وكلمة 'use'دوال السهمدوال الـ Callbackاستخدام 'call_user_func'دوال المتغيراتالتمرير بالمرجعالدوال العوديةمراجعة: مزيج الدوال4المصفوفات متعددة الأبعاد
إنشاء مصفوفة ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادتعديل عناصر المصفوفة ثنائية الأبعادالتكرار باستخدام الحلقات المتداخلةالمصفوفات الترابطية ثنائية الأبعادمراجعة: تمرين الشبكة البسيطة2معالجة المصفوفات المتقدمة
الإضافة باستخدام 'array_push'الحذف باستخدام 'array_pop'الإضافة باستخدام 'array_unshift'الحذف باستخدام 'array_shift'دمج المصفوفات المفهرسةدمج المصفوفات الترابطيةالاستخراج باستخدام 'array_slice'القيم باستخدام 'in_array'المفاتيح باستخدام 'array_search'مراجعة: تمرين قائمة التشغيل3ترتيب المصفوفات
ترتيب المصفوفات المفهرسة تصاعدياًترتيب المصفوفات المفهرسة تنازلياًترتيب المصفوفات الترابطية حسب القيمةترتيب المصفوفات الترابطية حسب المفتاحالترتيب بالترتيب الطبيعيالترتيب المخصص باستخدام 'usort'مراجعة: ترتيب لوحة المتصدرين