البرمجة

تحليل استخدام الاستدعاء الذاتي في برمجة C باستخدام مثال عملي

في الكود المُقدم، يُظهر لنا دالة foo التي تقوم بتنفيذ البحث عن القيمة القصوى في مصفوفة a باستخدام الاستدعاء الذاتي (recursion). وفي الدالة الرئيسية main، يتم إنشاء مصفوفة b وملء عناصرها بقيم عشوائية، ثم يتم استدعاء دالة foo مع المصفوفة b وعدد العناصر الكلي 81.

المتغير a يتم تعريفه كمصفوفة محلية داخل دالة foo ويتم استخدامه في كل استدعاء لهذه الدالة. بما أننا نقوم بإعادة استخدام نفس المصفوفة في كل استدعاء، يحدث تكرار لها أثناء التنفيذ، وهذا يؤدي إلى وجود عدة نسخ من المصفوفة في الذاكرة في ذلك الوقت.

إذا كان لديك دالة foo تستخدم مصفوفة a مرة واحدة فقط لكل مستوى من مستويات الاستدعاء، فإن عدد النسخ المستقلة من المصفوفة التي ستتواجد في الذاكرة يتساوى بعدد مستويات الاستدعاء. في هذا السياق، إذا كان لديك 81 استدعاء للدالة foo، فإن عدد النسخ المستقلة من المصفوفة سيكون 81 أيضًا.

لكن يجب أن نراعي أيضاً أن المصفوفة a تعرف داخل الدالة foo وتكون محلية لكل دعوة للدالة، وليس لديها وجود خارج نطاق الدالة. إذا كان لديك نفس الاسم (a) مستخدمًا في مكان آخر في برنامجك، فإنه قد يؤثر على الإجابة.

لذا، لتحديد العدد الصحيح للمتغيرات a، يجب أن تأخذ في اعتبارك عدد المستويات الفعلية للاستدعاء وتأثير النطاقات المحلية. وفي هذا السياق، يبدو أن العدد الصحيح للمتغيرات a هو 81.

المزيد من المعلومات

في الكود المقدم، يظهر لنا تطبيق للتقنية المعروفة باسم “الاستدعاء الذاتي” (recursion)، حيث تقوم دالة foo بالاستدعاء نفسها بشكل متكرر. الهدف من هذا الكود يبدو أنه البحث عن أكبر قيمة في مصفوفة معينة.

لفهم كيفية تحديد عدد متغيرات a المستخدمة في الذاكرة، يجب النظر في كيفية تنفيذ الاستدعاء الذاتي. في كل مرة يتم فيها استدعاء foo، يتم إنشاء مصفوفة a محلية جديدة في الذاكرة، والتي تكون مستقلة تمامًا عن النسخ السابقة. وهذا يعني أن عدد المتغيرات a في الذاكرة يتوقف على عدد المرات التي يتم فيها استدعاء foo.

في هذا السياق، إذا كان لديك استدعاء لدالة foo مع قيمة n، فإن هذا يؤدي إلى إنشاء مصفوفة a جديدة مع كل استدعاء. وبما أنك تقوم بالاستدعاء مع n-1 في كل مرة، يمكننا القول أن العدد الإجمالي للمصفوفات a في الذاكرة يكون مساويًا لمجموع الأعداد من 1 إلى n، أو بشكل أدق، الجملة الحسابية “n * (n + 1) / 2”.

إذاً، إذا كنت قد قمت بـ 81 استدعاءً لدالة foo، يمكننا حساب العدد الإجمالي للمصفوفات a في الذاكرة باستخدام الجملة الحسابية المذكورة أعلاه. وهو:

81×(81+1)2=81×822=3321\frac{81 \times (81 + 1)}{2} = \frac{81 \times 82}{2} = 3321

إذاً، يمكننا القول أن هناك 3321 مصفوفة a مستخدمة في الذاكرة بعد 81 استدعاءً لدالة foo. يجب مراعاة أن هذا الحساب يستند إلى افتراض أن المتغير a المحلي يتم تعريفه في كل استدعاء بشكل منفصل ولا يتم مشاركته بين استدعاء وآخر.

زر الذهاب إلى الأعلى