Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ما هو التكرار (Iteration)؟

التكرار (iteration) في البرمجة هو إعادة تنفيذ مجموعة من التعليمات، عادةً بحلقة، حتى يتحقق شرط ما أو تُعالَج كل عناصر مجموعة. وكل مرور واحد على التعليمات المكررة يُسمّى أيضًا تكرارًا.

بقلم Kevin Spektor, شريك مؤسس ورئيس قسم التكنولوجيا (CTO)

آخر تحديث 24 سبتمبر 2026

البرنامج الذي يرسل بريدًا تذكيريًا إلى 10,000 مستخدم لا يحتوي على 10,000 نسخة من كود الإرسال. إنه يحتوي على الكود مرة واحدة داخل حلقة، والحلقة تشغّله مرة لكل مستخدم. كل تشغيل هو تكرار واحد، والحلقة بمجملها هي طريقة البرنامج في المرور على مستخدميه.

كيف يعمل التكرار خطوة بخطوة

كل حلقة تتبع الدورة نفسها:

  1. الفحص. اختبر شرط الحلقة، وهو قيمة منطقية (boolean): هل يوجد عنصر آخر، أو هل ما زال العدّاد أقل من الحد؟
  2. التنفيذ. إذا كان الجواب صوابًا، نفّذ جسم الحلقة مرة واحدة.
  3. التحديث. انتقل إلى العنصر التالي أو غيّر العدّاد.
  4. الإعادة. عُد إلى الخطوة 1. وعندما يعطي الفحص خطأ، يتابع البرنامج الكود الذي بعد الحلقة.

هنا يُنفَّذ جسم الحلقة خمس مرات، وكل تكرار يضيف العدد التالي إلى مجموع متراكم:

iteration 1 total is now 1
iteration 2 total is now 3
iteration 3 total is now 6
iteration 4 total is now 10
iteration 5 total is now 15
Done: 15

المتغير total يوجد خارج الحلقة، لذا يحتفظ بقيمته من تكرار إلى التالي. وهذا النمط، أي متغير يُعيَّن قبل الحلقة ويُحدَّث داخلها، يُسمّى المُراكِم (accumulator)، ويظهر في كل حلقة تقريبًا تحسب شيئًا.

حلقات العدّ وحلقات الشرط

للتكرار نوعان. التكرار المحدد يعمل عددًا معروفًا من المرات: مرة لكل عنصر في قائمة، أو مرة لكل عدد من 1 إلى 5. وحلقة for في Python مصممة لهذا، وغالبًا مع range().

أما التكرار غير المحدد فيعيد التنفيذ حتى يحدث شيء ما، وعدد المرات غير معروف مسبقًا. وحلقة while تناسب هذه الحالة:

8 years, balance 214.36

المال الذي ينمو بنسبة 10% سنويًا يحتاج إلى 8 سنوات ليتضاعف. وقد توصّل البرنامج إلى ذلك بالتكرار، لا بحل معادلة. ويشرح دليلا حلقات for وحلقات while النوعين في Python.

المرور على مجموعة

معظم الحلقات تمر على مجموعة: عناصر مصفوفة، أو أحرف سلسلة نصية، أو أسطر ملف. تعطيك حلقة for في Python كل عنصر مباشرة، وتضيف enumerate() موقعه:

0 apple
1 banana
2 cherry

خلف الكواليس، تطلب for من المجموعة مكرِّرًا (iterator) باستخدام iter()، ثم تستدعي next() عليه مرة في كل تكرار. ويمكنك إجراء الاستدعاءات نفسها بنفسك:

red
green
blue
no more items

بدون القيمة الافتراضية، يطلق استدعاء next() الرابع الاستثناء StopIteration. وهذا الاستثناء هو الإشارة التي تعرف بها حلقة for أن المجموعة انتهت.

وتكتب اللغات الأخرى الفكرة نفسها بطرق مختلفة. تعدّ C باستخدام فهرس، بينما لدى Java وJavaScript أيضًا حلقة تعطيك كل عنصر:

for (int i = 0; i < 3; i++) {
    printf("%s\n", colors[i]);
}
for (String color : colors) {
    System.out.println(color);
}
for (const color of colors) {
    console.log(color);
}

التكرار مقابل الاستدعاء الذاتي

الاستدعاء الذاتي (recursion) هو الطريقة الأخرى لإعادة العمل: دالة تستدعي نفسها على نسخة أصغر من المسألة حتى تصل إلى حالة تستطيع الإجابة عنها مباشرة. كل ما يُكتب بإحداهما يمكن كتابته بالأخرى، لكنهما تتصرفان بشكل مختلف:

التكرارالاستدعاء الذاتي
كيف يعيدالحلقة تقفز إلى بدايتهاالدالة تستدعي نفسها
متى يتوقفعندما يصبح شرط الحلقة خطأعند الوصول إلى الحالة الأساسية
الذاكرةالمقدار نفسه مهما كان عدد المراتإطار مكدس (stack frame) لكل استدعاء ما زال مفتوحًا
الفشل المعتادحلقة لا نهائيةفيضان المكدس (RecursionError في Python)
يناسبالقوائم والعدّادات والإعادة حتى تحقق شرطالأشجار والبيانات المتداخلة وأسلوب فرّق تسد

صف الذاكرة مهم عمليًا. تسمح Python افتراضيًا بنحو 1,000 استدعاء متداخل، لذا يفشل الجمع بالاستدعاء الذاتي لـ 5,000 عدد حيث لا تواجه الحلقة أي مشكلة:

5050 5050
12502500
sum_recursive(5000) failed: RecursionError

ويُظهر التمثيل المرئي للاستدعاء الذاتي مكدس الاستدعاءات وهو يكبر ويصغر خطوة بخطوة.

أخطاء شائعة

الحلقة اللانهائية. حلقة while التي لا يصبح شرطها خطأ أبدًا تعمل حتى توقف البرنامج. والسبب المعتاد هو نسيان خطوة التحديث، مثل حذف count = count - 1.

الخطأ بفارق واحد (off by one). يعطي range(1, 5) الأعداد 1 و2 و3 و4، وليس 5، لأن القيمة النهائية مستبعدة. والحلقة التي تعمل مرة زائدة أو ناقصة تظل تعمل دون خطأ وتعطي جوابًا خاطئًا، وهذا خطأ منطقي.

تغيير القائمة أثناء المرور عليها. حذف عناصر من القائمة التي تمر عليها يجعل الحلقة تتخطى عناصر:

[1, 2, 3]

بقي أحد العددين 2، لأن حذف الـ 2 الأول أزاح الثاني إلى موقع كانت الحلقة قد تجاوزته. أنشئ قائمة جديدة بدلًا من ذلك: numbers = [n for n in numbers if n != 2].

إلى أين بعد ذلك

الحلقات تمر على المجموعات، لذا فإن ما هي المصفوفة هي الصفحة المرافقة الطبيعية، وتشرح صفحة ما هي القيمة المنطقية فحوص الصواب والخطأ التي تقرر متى تتوقف الحلقة. وعندما تعطي الحلقة نتيجة خاطئة دون رسالة خطأ، اقرأ ما هو الخطأ المنطقي. ولتتدرّب على كتابة الحلقات، ابدأ دورة Python أو جرّب الأمثلة السابقة في Python Playground.

الأسئلة الشائعة

ما هو مثال على التكرار؟
حلقة for تطبع كل اسم في قائمة من 100 مستخدم تنفّذ 100 تكرار، واحدًا لكل اسم. وحلقة while تواصل طلب كلمة المرور حتى تُكتب الكلمة الصحيحة هي تكرار أيضًا، مع أن عدد المرات غير معروف مسبقًا.
أيهما أفضل، الاستدعاء الذاتي أم التكرار؟
لا أحد منهما أفضل بشكل عام. التكرار يستخدم مقدارًا ثابتًا من الذاكرة، وهو عادةً أسرع في الإعادة البسيطة، مثل جمع قائمة أو العدّ. أما الاستدعاء الذاتي (recursion) فيعطي كودًا أقصر وأوضح للمسائل ذات الطبيعة التعاودية، مثل المرور على شجرة مجلدات، لكن كل استدعاء يستهلك من ذاكرة المكدس، والاستدعاء الذاتي العميق جدًا يفشل في لغات مثل Python.
هل التكرار هو نفسه الحلقة؟
تقريبًا. الحلقة هي البنية اللغوية، مثل for أو while، والتكرار هو الإعادة التي تؤديها. والمرور الواحد على جسم الحلقة يُسمّى أيضًا تكرارًا، فالحلقة التي تعمل 5 مرات تؤدي 5 تكرارات.
ما الفرق بين السبرنت (sprint) والتكرار في إدارة المشاريع؟
في إدارة مشاريع البرمجيات، التكرار فترة ثابتة، عادةً من أسبوع إلى أربعة أسابيع، يخطط فيها الفريق لجزء من برنامج يعمل ويبنيه ويراجعه. ويسمّي إطار Scrum هذه الفترة سبرنت (sprint)، فالكلمتان عمليًا بمعنى واحد. وهذا معنى مختلف عن التكرار في الكود.
ماذا تعني كلمة iterable؟
الكائن القابل للتكرار (iterable) هو أي كائن يمكنك المرور عليه بحلقة for، مثل القائمة أو السلسلة النصية أو القاموس أو الملف أو range. وفي Python يكون الكائن قابلًا للتكرار إذا استطاعت iter() أن تُنتج منه مكرِّرًا (iterator). والأعداد الصحيحة ليست قابلة للتكرار، ولهذا يطلق for x in 5: الخطأ TypeError.
Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن