مقدمة في الاستدعاء الذاتي
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 47 من 65.
العودية (Recursion) هي تقنية برمجية تقوم فيها الدالة باستدعاء نفسها لحل مشكلة ما. فكر فيها كأنك تنظر في مرآتين متقابلتين - حيث يحتوي كل انعكاس على نسخة أصغر من نفس الصورة، مما يخلق حلقة لا نهائية حتى تصبح الانعكاسات أصغر من أن تُرى.
تحتاج كل دالة عودية إلى مكونين أساسيين لتعمل بشكل صحيح. الحالة الأساسية هي الشرط الذي يوقف العودية - فهي تشبه النقطة التي تصبح فيها انعكاسات المرآة أصغر من أن تكون ذات أهمية. بدون حالة أساسية، ستستدعي الدالة نفسها إلى الأبد، مما يؤدي في النهاية إلى تعطل برنامجك.
إن الخطوة العودية هي المكان الذي تستدعي فيه الدالة نفسها بنسخة معدلة من المشكلة الأصلية. في كل مرة تستدعي فيها الدالة نفسها، يجب أن تعمل على نسخة أصغر أو أبسط من المشكلة، وتتحرك تدريجياً نحو الحالة الأساسية.
تخيل أنك تبحث عن مفاتيحك في كومة من الأوراق. يمكنك التحقق من الورقة العلوية، وإذا لم تكن مفاتيحك هناك، فستفعل الشيء نفسه مع الكومة المتبقية (التي أصبحت الآن أصغر بورقة واحدة). ستستمر في تكرار هذه العملية حتى تجد مفاتيحك أو لا يتبقى المزيد من الأوراق للتحقق منها.
إن هذا النهج المتمثل في تقسيم مشكلة كبيرة إلى مشكلات أصغر ومتماثلة هو ما يجعل العودية (recursion) قوية للغاية لأنواع معينة من التحديات البرمجية.
ورقة مرجعية
العودية (Recursion) هي تقنية برمجية تستدعي فيها الدالة نفسها لحل مشكلة ما عن طريق تقسيمها إلى مشكلات أصغر ومتطابقة.
تحتاج كل دالة عودية إلى مكونين أساسيين:
الحالة الأساسية (Base case): الشرط الذي يوقف العودية لمنع الحلقات اللانهائية.
الخطوة العودية (Recursive step): حيث تستدعي الدالة نفسها بنسخة معدلة من المشكلة الأصلية، وتنتقل تدريجياً نحو الحالة الأساسية.
جرّب بنفسك
لا يتضمّن هذا الدرس تحدّيًا برمجيًا.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون7الدوال المتقدمة
الدوال المجهولةتمرير الدوال كوسطاءفهم الـ Closuresمقدمة في الاستدعاء الذاتيدالة الاستدعاء الذاتي: العد التنازليدالة الاستدعاء الذاتي: العامليمراجعة - معالج القوائم2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة