الاستدعاء الذاتي هو عنوان الدرس الأول من الوحدة الثانية التي تحمل اسم “خوارزميات الذكاء الاصطناعي” من الفصل الدراسي الأولى من مقرر “الذكاء الاصطناعي”.
ستتعرف في هذا الموضوع على مفهوم الاستدعاء الذاتي، وكيفية استخدام دالة الاستدعاء التكرارية، وتحديد مزايا الاستدعاء الذاتي وعيوبه، والقدرة على التمييز بين الاستدعاء الذاتي والتكرار، بالإضافة إلى الحذر عند استخدام دالة الاستدعاء التكرارية اللانهائية.
لذا قم بقراءة أهداف التعلُّم بعناية، ثم أعد قراءتها وتأكَّد من تحصيل كافة محتوياتها بعد انتهائك من دراسة الموضوع.
أهداف التعلُّم
معرفة مفهوم الاستدعاء الذاتي.
استخدام دالة الاستدعاء التكرارية.
إنشاء دالة استدعاء تكرارية.
تحديد مزايا الاستدعاء الذاتي وعيوبه.
التمييز بين الاستدعاء الذاتي والتكرار.
استخدام دالة الاستدعاء التكرارية اللانهائية بحذر.
هيا لنبدأ!
تقسيم المُشكلة (Dividing the Problem)
في هذا الموضوع، ستتعلَّم استخدام الدوال التكرارية لتبسيط البرنامج وزيادة كفاءته.
تخيَّل أن والداك قد أحضرا لك هدية، وكنت متلهفًا لمعرفتها، ولكن عندما فتحت الصندوق، وجدت صندوقًا جديدًا بداخله، وعندما فتحته وجدت آخر بداخله، وهكذا حتى عجزت أن تعرف في أي صندوق توجد الهدية.
الاستدعاء الذاتي (Recursion)
الاستدعاء الذاتي هو أحد طرائق حل المشكلات في علوم الحاسب، وتتم عن طريق تقسيم المشكلة إلى مجموعة من المشكلات الصغيرة المشابهة للمشكلة الأصلية حتى يمكنك استخدام الخوارزمية نفسها لحل تلك المشكلات.
يُستخدَم الاستدعاء الذاتي بواسطة أنظمة التشغيل والتطبيقات الأخرى، كما تدعمه معظم لغات البرمجة.
معلومة
يحدث الاستدعاء الذاتي عندما تتكرر التعليمات نفسها، ولكن مع بيانات مختلفة وأقل تعقيدًا.
ألقِ نظرة على مثال دالة لتستدعي دالة أخرى.
لمعرفة المزيد من المعلومات عن الاستدعاء الذاتي، قم بالاطّلاع على الرابط التالي:
في بعض الحالات تستدعي الدالة نفسها وهذه الخاصية تسمى الاستدعاء التكراري (Recursive Call).
يكون بناء الجملة العام لدالة الاستدعاء التكرارية على النحو التالي:
معلومة
الاستدعاء التكراري هو عملية استدعاء الدالة لنفسها.
تتكون دالة الاستدعاء التكرارية من حالتين:
الحالة الأساسية Base Case
في هذه الحالة تتوقف الدالة عن استدعاء نفسها، ويتأكد الوصول إلى هذه الحالة من خلال الأمر المشروط، بدون الحالة الأساسية، ستتكرر عملية الاستدعاء الذاتي إلى مالا نهاية.
حالة الاستدعاء التكرارية Recursive Common Example
في هذه الحالة تستدعي الدالة نفسها عندما لا تحقق شروط التوقف، وتظل الدالة في حالة الاستدعاء الذاتي حتى تصل إلى الحالة الأساسية.
أمثلة شائعة على الاستدعاء الذاتي Recursion Common Examples
أحد الأمثلة الأكثر شيوعًا على استخدام الاستدعاء الذاتي هو عملية حساب مضروب رقم معين.
مضروب الرقم هو ناتج ضرب جميع الأعداد الطبيعية الأقل من أو تساوي ذلك الرقم.
يُعبّر عن المضروب بالرقم متبوعًا بالعلامة “!”.
على سبيل المثال، مضروب الرقم 5 هو 5! ويساوي 1*2*3*4*5.
لإنشاء برنامج يقوم باحتساب مضروب العدد باستخدام حلقة التكرار for، اتبع ما يلي:
الآن احسب مضروب العدد باستخدام دالة المضروب.
بإمكانك مراجعة محتوى موضوع “الاستدعاء الذاتي” من بدايته وحتى هذه النقطة، من خلال الرابط التالي:
الاستدعاء الذاتي والتكرار (Recursion and Iteration)
يستخدم كل من الاستدعاء الذاتي والتكرار في تنفيذ مجموعة من التعليمات لعدة مرات.
الفارق الرئيسي بين الاستدعاء الذاتي والتكرار هو طريقة إنهاء الدالة التكرارية.
دالة الاستدعاء التكرارية تستدعي نفسها وتنهي التنفيذ عندما تصل إلى الحالة الأساسية.
التكرار يُنفذ لبنة المقطع البرمجي باستمرار حتى يتحقق شرط محدد أو ينقضي عدد محدد من التكرارات.
الجدول التالي يعرض بعض الاختلافات بين الاستدعاء الذاتي والتكرار.
متى نستخدم الاستدعاء الذاتي؟
يعد الاستدعاء الذاتي الطريقة الأكثر ملائمة للتعامل مع المشكلة في العديد من الحالات.
يسهل اكتشاف بعض هياكل البيانات باستخدام الاستدعاء الذاتي.
بعض خوارزميات التصنيف (Sorting Algorithm)، تستخدم الاستدعاء الذاتي مثل: التصنيف السريع (Quick Sort).
في المثال التالي، سنستخرج أكبر رقم موجود في قائمة مكونة من الأرقام باستخدام دالة الاستدعاء التكرارية، كما يظهر في السطر الأخير من المثال دالة أخرى للتكرار لغرض المقارنة.
في البرنامج التالي، ستُنشئ دالة استدعاء تكرارية لحساب مضاعف الرقم.
سنقوم بإدخال رقمًا (الأساس) وفهرسًا (الأس أو القوة) يقبلهما البرنامج، ومن ثم سنستخدم دالة الاستدعاء التكرارية PowerFunRecursive() التي تستخدم هذين المدخلين لحساب مضاعف الرقم، يمكن تحقيق الأمر نفسه باستخدام التكرار، والمثال التالي يوضح ذلك:
يجب أن تكون حذرًا للغاية عند تنفيذ الاستدعاء التكراري.
كما يجب عليك استخدام طريقة معينة لإيقاف التكرار عند تحقيق شرط محدد لتجنب حدوث الاستدعاء التكراري اللانهائي، الذي يسبب توقف النظام عن الاستجابة بسبب كثرة استدعاءات الدالة، مما يؤدي إلى فيض الذاكرة (Memory Overflow) وإنهاء التطبيق.
بإمكانك مراجعة محتوى موضوع “الاستدعاء الذاتي” بدايةً من عنوان “مزايا الاستدعاء الذاتي وعيوبه” وحتى نهاية الموضوع، من خلال الرابط التالي:
اختبر تحصيلك لمحتوى الموضوع من خلال الرابط التالي:
الواجب الإلكتروني
إلى هنا يكون قد انتهى موضوع “الاستدعاء الذاتي”، لا تنسوا مراجعة أهداف التعلُّم أعلى المقال، وانتظرونا في الموضوع القادم!