📝 أسئلة اختبارية
عدد الأسئلة: 8
سؤال 1: حدد الجملة الصحيحة والجملة الخاطئة فيما يلي:
الإجابة الصحيحة: انظر الأسئلة الفرعية
الشرح: هذا سؤال رئيسي يحتوي على أسئلة فرعية
تلميح: راجع الأسئلة الفرعية أدناه
سؤال 2: ما الاختلافات بين التكرار والاستدعاء الذاتي؟
- أ) التكرار يستخدم الحلقات فقط، بينما الاستدعاء الذاتي لا يستخدم أي حلقات
- ب) الاستدعاء الذاتي أسرع دائماً من التكرار في جميع الحالات
- ج) التكرار والاستدعاء الذاتي متطابقان تماماً في الأداء والوظيفة
- د) الاستدعاء الذاتي يتطلب ذاكرة أقل من التكرار دائماً
الإجابة الصحيحة: التكرار يستخدم الحلقات (مثل for، while) لتنفيذ المهام المتكررة، بينما الاستدعاء الذاتي يستدعي الدالة نفسها لحل المشكلة. التكرار عادة أسرع وأقل استهلاكاً للذاكرة، بينما الاستدعاء الذاتي أكثر وضوحاً رياضياً وأسهل في كتابة بعض الخوارزميات.
الشرح: الاختلافات الرئيسية: 1) الآلية: التكرار يستخدم الحلقات، الاستدعاء الذاتي يستخدم استدعاء الدالة نفسها. 2) الأداء: التكرار أسرع وأقل استخداماً للذاكرة. 3) الوضوح: الاستدعاء الذاتي أكثر وضوحاً للمشاكل الرياضية والتكرارية. 4) التعقيد: الاستدعاء الذاتي قد يؤدي إلى فيض المكدس إذا لم يكن مصمماً بشكل صحيح.
تلميح: قارن من حيث الآلية، الأداء، الوضوح، والتعقيد
سؤال 3: متى يجب استخدام الاستدعاء الذاتي؟
- أ) يجب استخدامه دائماً لأنه أفضل من التكرار في جميع الحالات
- ب) يجب استخدامه فقط عندما تكون المشكلة بسيطة ولا تحتاج إلى تقسيم
- ج) يجب استخدامه عندما تكون المشكلة معقدة جداً ولا يمكن حلها بالتكرار
- د) يجب استخدامه عندما يكون عمق التكرار غير معروف أو غير محدود
الإجابة الصحيحة: يجب استخدام الاستدعاء الذاتي عندما تكون المشكلة قابلة للتقسيم إلى مشاكل فرعية متشابهة أصغر، وعندما يكون الحل الرياضي أو الخوارزمي أكثر وضوحاً باستخدام التكرار، وعندما لا يكون الأداء الزمني أو استخدام الذاكرة حاسماً.
الشرح: استخدام الاستدعاء الذاتي مناسب في: 1) المشاكل ذات الطبيعة التكرارية الطبيعية (مثل شجرة العائلة، الملفات المجلدية). 2) الخوارزميات الرياضية (مثل حساب المضروب، متتالية فيبوناتشي). 3) عندما يكون الكود أكثر قابلية للقراءة والفهم. 4) عندما يكون عمق التكرار محدوداً ومعروفاً.
تلميح: فكر في أنواع المشاكل التي تكون طبيعتها تكرارية
سؤال 1: تتكون دالة الاستدعاء التكرارية من حالتين.
الإجابة الصحيحة: صحيحة
الشرح: دالة الاستدعاء التكرارية تتكون عادة من حالتين: الحالة الأساسية (base case) التي توقف التكرار، والحالة التكرارية (recursive case) التي تستدعي الدالة نفسها.
تلميح: فكر في هيكل الدوال التكرارية النموذجي
سؤال 1: تستدعي دالة الاستدعاء التكرارية دالة أخرى.
الإجابة الصحيحة: خاطئة
الشرح: دالة الاستدعاء التكرارية تستدعي نفسها (ذاتياً) وليس دالة أخرى. هذا هو جوهر مفهوم الاستدعاء الذاتي.
تلميح: ما هو تعريف الدالة التكرارية؟
سؤال 1: دوال الاستدعاء التكرارية أسرع في التنفيذ.
الإجابة الصحيحة: خاطئة
الشرح: دوال الاستدعاء التكرارية عادة ما تكون أبطأ في التنفيذ من الحلول التكرارية بسبب تكلفة استدعاء الدوال المتكرر واستخدام الذاكرة الإضافية.
تلميح: قارن بين الأداء الزمني للتكرار والاستدعاء الذاتي
سؤال 1: استدعاء الدوال يجعل لبنة المقطع البرمجي أصغر حجماً.
الإجابة الصحيحة: صحيحة
الشرح: استدعاء الدوال يسمح بإعادة استخدام الكود وتقسيم البرنامج إلى وحدات أصغر، مما يجعل كل لبنة برمجية أكثر تركيزاً وأصغر حجماً.
تلميح: فكر في فوائد استخدام الدوال في البرمجة
سؤال 1: كتابة مقطع برمجي متكرر يتطلب استدعاءً ذاتياً أقل.
الإجابة الصحيحة: خاطئة
الشرح: كتابة مقطع برمجي متكرر يتطلب استدعاءً ذاتياً أكثر، حيث أن الطبيعة التكرارية تعتمد على استدعاء الدالة نفسها بشكل متكرر لحل المشكلة.
تلميح: ما هو المبدأ الأساسي للبرمجة التكرارية؟
🎴 بطاقات تعليمية للمراجعة
عدد البطاقات: 4 بطاقة لهذه الصفحة
ما هي الحالات الأساسية التي يجب أن تتكون منها دالة الاستدعاء التكراري (Recursive Function) لتجنب الحلقات اللانهائية؟
الإجابة: تتكون دالة الاستدعاء التكراري من حالتين رئيسيتين: حالة الأساس (Base Case) وهي الشرط الذي يوقف التكرار، وحالة التكرار (Recursive Step) حيث تقوم الدالة باستدعاء نفسها مع مدخلات جديدة تقترب من حالة الأساس.
الشرح: حالة الأساس تضمن أن الدالة ستتوقف في النهاية، بينما حالة التكرار تضمن تقدم الحل نحو حالة الأساس. بدون حالة أساس، ستستمر الدالة في الاستدعاء الذاتي بشكل لا نهائي.
تلميح: فكر في الشرط الذي يمنع الدالة من استدعاء نفسها إلى ما لا نهاية.
في سياق البرمجة، كيف تختلف دالة الاستدعاء الذاتي (Recursion) عن التكرار (Iteration)؟
الإجابة: التكرار يستخدم حلقات (مثل for أو while) لتنفيذ مجموعة من التعليمات بشكل متكرر، بينما الاستدعاء الذاتي يجعل الدالة تستدعي نفسها لحل مشكلة معقدة عن طريق تقسيمها إلى مشكلات فرعية أصغر من نفس النوع، مع وجود حالة أساس لوقف التكرار.
الشرح: التكرار يعتمد على عداد أو شرط للحلقة، بينما الاستدعاء الذاتي يعتمد على تقسيم المشكلة إلى نسخ أصغر منها حتى الوصول إلى الحالة الأساسية التي يمكن حلها مباشرة.
تلميح: قارن بين استخدام الحلقات واستخدام استدعاء الدالة لنفسها.
متى يكون استخدام الاستدعاء الذاتي خيارًا مفضلاً أو مناسبًا في تصميم البرمجيات؟
الإجابة: يكون استخدام الاستدعاء الذاتي مناسبًا عندما يمكن تقسيم المشكلة بشكل طبيعي إلى مشكلات فرعية أصغر لها نفس هيكل المشكلة الأصلية، مثل معالجة هياكل البيانات الشجرية (Trees)، أو خوارزميات البحث والفرز التي تتطلب تقسيم البيانات، أو عند الحاجة إلى حلول تكون أكثر أناقة ووضوحًا للمشكلات التي تتميز بطبيعتها المتكررة.
الشرح: الاستدعاء الذاتي يتألق في المشكلات التي تتبع نمطاً متكرراً حيث يمكن وصف الحل العام بناءً على حلول للمشكلات الأصغر. الأمثلة الشائعة تشمل حساب مضروب الأعداد (factorial) أو تسلسل فيبوناتشي.
تلميح: فكر في أنواع المشكلات التي يمكن حلها بتقسيمها إلى أجزاء أصغر من نفس النوع.
هل استدعاء الدوال (بشكل عام) يجعل لبنة المقطع البرمجي أصغر حجماً؟ وضح ذلك.
الإجابة: نعم، استدعاء الدوال يمكن أن يجعل لبنة المقطع البرمجي أصغر حجماً. عندما يتم استخراج جزء من الشيفرة البرمجية إلى دالة منفصلة، فإن الشيفرة الأصلية تصبح مجرد استدعاء لهذه الدالة، مما يقلل من حجم الشيفرة في مكان استدعائها الأصلي ويحسن قابلية القراءة وإعادة الاستخدام.
الشرح: تجميع التعليمات المتكررة في دالة واحدة ثم استدعائها من أماكن متعددة يؤدي إلى تقليل إجمالي عدد الأسطر البرمجية في الملف الرئيسي، وجعل الشيفرة منظمة أكثر.
تلميح: فكر في مبدأ 'تقسيم العمل' وكيف يقلل من تكرار الشيفرة في أماكن مختلفة.