البرمجة

فهم الاستدعاء التكراري في C بخمس خطوات

في بداية الأمر، يتعين عليك أن تدرك أن الشيفرة التي قدمتها تستخدم مفهوم الاستدعاء التكراري (Recursion)، وهو نهج برمجي يتيح لدالة أن تستدعي نفسها خلال تنفيذها. هذا الأمر يمكن أن يكون قويًا ومفيدًا في بعض الحالات، ولكن يتطلب فهماً جيداً لعملية التنفيذ وكيفية تكرار الدالة نفسها.

لفهم كيفية عمل الشيفرة التي قدمتها، دعونا نقوم بتحليلها خطوة بخطوة.

أولاً، يتم استدعاء الدالة fun(4) في دالة main()، حيث يكون القيمة الممررة للمتغير n هي 4.

داخل دالة fun()، يتم التحقق مما إذا كانت قيمة n أكبر من صفر. إذا كانت الشرط صحيحًا، يتم تنفيذ الكود داخل الفقرة الشرطية.

تبدأ الخطوة الأولى بالاستدعاء fun(n-1)، حيث يصبح n الآن 3. يتم تكرار هذه العملية حتى يصل n إلى القيمة 0. خلال هذه العمليات، يتم تخزين كل استدعاء في الذاكرة بفضل مكالمة الدالة والانتقال إلى السطر التالي بعد استدعاء الدالة.

بعد الانتهاء من الجزء الأول من الاستدعاءات، يتم طباعة قيمة n الحالية (التي هي 1 في هذه المرحلة).

ثم يتم استدعاء fun(n-1) مرة أخرى، حيث يكون n الآن 2. ومن ثم يتم طباعة القيمة الحالية لـ n وهي 2.

تستمر هذه العمليات حتى الوصول إلى n يساوي 4 مرة أخرى، ولكن بالترتيب العكسي. يتم طباعة القيم في ترتيب معين بناءً على ترتيب الاستدعاءات وطريقة وصول n إلى قيمة 0 ثم العودة.

الناتج النهائي الذي تم طباعته هو “1 2 1 3 1 2 1 4 1 2 1 3 1 2 1”.

فيما يلي تفصيل إضافي حول تتابع الاستدعاءات والطباعة:

  1. الاستدعاء الأول: fun(4) -> fun(3) -> fun(2) -> fun(1) -> fun(0) (طباعة 1) -> طباعة 2 -> fun(1) -> fun(0) (طباعة 1) -> طباعة 3 -> …
  2. الاستدعاء الثاني: fun(3) -> fun(2) -> fun(1) -> fun(0) (طباعة 1) -> طباعة 2 -> fun(1) -> fun(0) (طباعة 1) -> طباعة 3 -> …
  3. الاستدعاء الثالث: fun(2) -> fun(1) -> fun(0) (طباعة 1) -> طباعة 2 -> fun(1) -> fun(0) (طباعة 1) -> طباعة 3 -> …
  4. الاستدعاء الرابع: fun(1) -> fun(0) (طباعة 1) -> طباعة 2 -> fun(1) -> fun(0) (طباعة 1) -> طباعة 3 -> …
  5. الاستدعاء الخامس: fun(0) (طباعة 1) -> طباعة 2 -> fun(1) -> fun(0) (طباعة 1) -> طباعة 3 -> …

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

لفهم الشيفرة بشكل أفضل، دعنا نتناول تفصيلًا أكثر حول كيفية عمل عمليات الاستدعاء وطباعة القيم في كل مرة:

  1. استدعاء fun(4):

    • fun(4) تستدعي fun(3) وتأتي بعد ذلك.
    • fun(3) تستدعي fun(2) وتأتي بعد ذلك.
    • fun(2) تستدعي fun(1) وتأتي بعد ذلك.
    • fun(1) تستدعي fun(0) وتأتي بعد ذلك.
    • fun(0) تطبع القيمة 1، ثم تعود للدالة fun(1) وتطبع القيمة 2، ومن ثم تطبع القيمة 1. تكرار هذه العمليات حتى تنتهي الدالة fun(1).
  2. عودة إلى fun(2):

    • بعد أن انتهت fun(1)، يتم طباعة القيمة 3 في fun(2)، ثم تستدعي fun(1) مرة أخرى.
    • fun(1) تطبع القيمة 1، ثم تعود للدالة fun(2) وتطبع القيمة 2، ومن ثم تطبع القيمة 1. تكرار هذه العمليات حتى تنتهي الدالة fun(2).
  3. عودة إلى fun(3):

    • بعد أن انتهت fun(2)، يتم طباعة القيمة 4 في fun(3)، ثم تستدعي fun(2) مرة أخرى.
    • تتكرر هذه العمليات حتى يتم الانتهاء من الدالة fun(3).
  4. عودة إلى fun(4):

    • بعد أن انتهت fun(3)، يتم طباعة القيمة 1 في fun(4)، ثم تستدعي fun(3) مرة أخرى.
    • تتكرر هذه العمليات حتى يتم الانتهاء من الدالة fun(4).

هذه العمليات تظهر كيف يتم استدعاء الدوال بشكل متكرر وكيف تتم طباعة القيم في كل استدعاء. يجب أن يكون فهم لطريقة تكرار الدوال وطريقة العودة من كل استدعاء هو الأمر الأساسي لفهم كيفية عمل الشيفرة بأكملها.

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