ما هو التكرار (Iteration)؟
التكرار (iteration) في البرمجة هو إعادة تنفيذ مجموعة من التعليمات، عادةً بحلقة، حتى يتحقق شرط ما أو تُعالَج كل عناصر مجموعة. وكل مرور واحد على التعليمات المكررة يُسمّى أيضًا تكرارًا.
آخر تحديث 24 سبتمبر 2026
البرنامج الذي يرسل بريدًا تذكيريًا إلى 10,000 مستخدم لا يحتوي على 10,000 نسخة من كود الإرسال. إنه يحتوي على الكود مرة واحدة داخل حلقة، والحلقة تشغّله مرة لكل مستخدم. كل تشغيل هو تكرار واحد، والحلقة بمجملها هي طريقة البرنامج في المرور على مستخدميه.
كيف يعمل التكرار خطوة بخطوة
كل حلقة تتبع الدورة نفسها:
- الفحص. اختبر شرط الحلقة، وهو قيمة منطقية (boolean): هل يوجد عنصر آخر، أو هل ما زال العدّاد أقل من الحد؟
- التنفيذ. إذا كان الجواب صوابًا، نفّذ جسم الحلقة مرة واحدة.
- التحديث. انتقل إلى العنصر التالي أو غيّر العدّاد.
- الإعادة. عُد إلى الخطوة 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 تواصل طلب كلمة المرور حتى تُكتب الكلمة الصحيحة هي تكرار أيضًا، مع أن عدد المرات غير معروف مسبقًا.أيهما أفضل، الاستدعاء الذاتي أم التكرار؟
هل التكرار هو نفسه الحلقة؟
for أو while، والتكرار هو الإعادة التي تؤديها. والمرور الواحد على جسم الحلقة يُسمّى أيضًا تكرارًا، فالحلقة التي تعمل 5 مرات تؤدي 5 تكرارات.ما الفرق بين السبرنت (sprint) والتكرار في إدارة المشاريع؟
ماذا تعني كلمة iterable؟
for، مثل القائمة أو السلسلة النصية أو القاموس أو الملف أو range. وفي Python يكون الكائن قابلًا للتكرار إذا استطاعت iter() أن تُنتج منه مكرِّرًا (iterator). والأعداد الصحيحة ليست قابلة للتكرار، ولهذا يطلق for x in 5: الخطأ TypeError.