مفهوم الإستدعاء الذاتي
الإستدعاء الذاتي ( Recursion ) يقصد به بناء كود يعيد تنفيذ نفسه بنفسه إلى حين إتمام مهمة معينة.
عملياً لتحقيق الإستدعاء الذاتي نقوم ببناء دالة تفعل return
لنفسها و هكذا نجعلها تستدعي نفسها.
الدالة التي تستدعي نفسها يقال لها Recursive Function.
في هذا الدرس ستفهم بدقة كيف يمكنك تطبيق الإستدعاء الذاتي حتى تكون قادر على التعامل معه بشكل مريح إن احتجته في مشاريعك المستقبلية.
فائدة الإستدعاء الذاتي
في حال كانت البيانات المراد التعامل معها موضوعة بشكل شجري ( Tree ) فهنا يكون التعامل معها بأسلوب الإستدعاء الذاتي أمر مناسب جداً و أسهل بكثير من التعامل معها بأساليب أخرى.

مثال عملي للاستدعاء الذاتي
إذا أردت تبديل كلمة موجودة في عدة ملفات بكلمة أخرى و كانت هذا الملفات موضوعة في عدد كبير من المجلدات المتداخلة. في هذه الحالة فإنك ستبني دالة تعمل كالتالي:
- كلما وجدت ملف تقوم بتبديل الكلمة الموجودة فيه.
- كلما وجدت مجلد تدخل إليه ثم تستدعي نفسها من جديد.
- حين لا تجد أي مجلد تتوقف عن استدعاء نفسها من جديد.
شروط الإستدعاء الذاتي
أول ما عليك التفكير به عند بناء دالة تستدعي نفسها هو الشرط الذي يجب وضعه لتحديد متى يجب أن تتوقف عن استدعاء نفسها لأنك إن لم تفعل ذلك ستمتلئ ذاكرة جهازك ( Recursion ) الأمر الذي سيجعله يعلّق و لا يستطيع الإستجابة لأي أمر آخر تعطيه له.
الإستدعاء الذاتي المدمر
في المثال التالي قمنا بتعريف دالة تظل تعيد استدعاء نفسها إلا ما لا نهاية، الأمر الذي يجعل محرر الكود يعلّق و يتوقف بتاتاً عن العمل في حال تشغيل الكود.
مثال
function badFunc()
{
return badFunc();
}
badFunc();
سيظهر لك الخطأ التالي عند التشغيل و الذي يعني أنه سيتم استدعاء الدالة بلى توقف و لذلك فإنه تم إيقافها من قبل محرر الكود لحماية جهازك من التعليق.
InternalError: too much recursion
شرح الكود
الفيديو التالي يشرح طريقة عمل الكود خطوة خطوة.
قريباً سيتم إضافة فيديو يشرح طريقة عمل الكود السابق بدقة.
الإستدعاء الذاتي الآمن
في المثال التالي قمنا بتعريف دالة تعيد استدعاء نفسها بنفسها 5 مرات فقط و من ثم تتوقف.
مثال
function count(start, end)
{
if (start <= end)
{
write("counter = " + start + "\n");
return count(start + 1, end);
}
}
count(1, 3);
سنحصل على النتيجة التالية عند التشغيل.
counter = 1
counter = 2
counter = 3
جرب الكود
شرح الكود
الفيديو التالي يشرح طريقة عمل الكود خطوة خطوة.
قريباً سيتم إضافة فيديو يشرح طريقة عمل الكود السابق بدقة.
تمارين شاملة حول الإستدعاء الذاتي
التمرين الأول
أكتب دالة تستدعي نفسها إسمها countRecursively
عند استدعاءها تعطيها عدد صحيح أكبر من 0 فتقوم بطباعة جميع الأعداد الصحيحة الموجودة من هذا العدد وصولاً إلى 0 بشكل تنازلي.
بعدها قم باستدعاء الدالة countRecursively()
لتجربتها.
الحل و التفسير »
التمرين الثاني
أكتب دالة تستدعي نفسها إسمها factorial
عند استدعاءها تعطيها عدد صحيح أكبر من 0 فترجع لك قيمة العاملي لهذا العدد.
بعدها قم باستدعاء الدالة factorial()
لتجربتها.
الحل و التفسير »
التمرين الثالث
أكتب دالة تستدعي نفسها إسمها sum
عند استدعاءها تعطيها عدد صحيح أكبر من 0 فترجع لك مجموع الأعداد من هذا العدد إلى 0.
بعدها قم باستدعاء الدالة sum()
لتجربتها.
الحل و التفسير »