ایتریشن

بندانگشتی|فلوچارت طنز تکرار
**ایتریشن**  یا **تکرار** به معنای اجرای چندبارهٔ یک فرآیند برای به دست آوردن نتیجه یا خروجی است. دنبالهٔ این عملیات به یک نقطهٔ پایانی یا مقدار پایانی نزدیک خواهد شد. هر بارِ اجرای فرآیند یک ایتریشن مستقل محسوب می‌شود و نتیجهٔ هر ایتریشن، نقطهٔ آغاز ایتریشن بعدی است.

در ریاضیات و علوم رایانه، ایتریشن (همراه با روش مکمل خود، یعنی بازگشت) پایه‌ای استاندارد برای الگوریتم‌ها است.

## در ریاضیات
یکی از معانی **تکرار** در ریاضیات، فرایند تکرار یک تابع است؛ یعنی اعمال یک تابع به‌طور مکرر، با استفاده از خروجی یک تکرار به عنوان ورودی به بعدی اشاره داشته باشد. تکرار کردن تابعی که به ظاهر ساده است، می‌تواند باعث ایجاد رفتارهایی پیچیده و مسائلی دشوار شود. برای مثال، می‌توان به حدس کولاتز و دنباله‌ی تردست  اشاره کرد.

معنای دیگر تکرار در ریاضیات، روش‌های تکرارپذیر است که برای به دست آوردن پاسخ عددیِ تقریبی برای برخی از مسائل ریاضی استفاده می‌شوند. برای نمونه، می‌توان به روش نیوتن اشاره کرد. محاسبهٔ دستی ریشهٔ دوم (جذر) اعداد نیز یک مثال معروف از روش‌های تکرارپذیر است که مورد استفاده متداول قرار دارد.

## در رایانش (محاسبه)
منظور از **ایتریشن** در رایانش، شگردی برای اجرای چندبارهٔ –با تعداد مشخص– یک دسته از دستورهای درونِ برنامه است. اصطلاحاً، روی این دسته از دستورها *ایتریت*  می‌شود. متخصصان علوم رایانه ممکن است که با نام «یک ایتریشن» از خود این دسته از دستورها نیز یاد کنند.

شبه‌کد زیر مثالی از ایتریشن است. روی خط کدی که بین آکولادهای حلقهٔ *for* است، سه بار «ایتریت» می‌شود:


 *a* = ۰
 **for** *i* **from** 1 **to** 3        // loop three times
 {
  *a* = *a* + i            // add the current value of i to a
 }
 print *a*                  // the number 6 is printed (0 + 1; 1 + 2; 3 + 3)


در مثال بالا، می‌توان دید که در خط درون حلقه، از متغیر `i` که در خود حلقه تعریف شده‌است، استفاده شده‌است و در هر بار از اجرای حلقه، یک واحد افزایش می‌یابد. این کار، ایرادی ندارد و حتی اغلب ضروری است که از مقادیر مورد استفاده در سایر قسمت‌های برنامه، درون قسمت بین آکولاد استفاده کرد تا عملکرد مورد نظر حاصل شود.

## ارتباط با بازگشت

هنگام انتخاب الگوریتم، بازگشت و **تکرار** را می‌توان با تأثیرگذاری یکسانی به کار برد. تفاوت اصلی این است که برای استفاده از الگوریتم‌های مبتنی بر تکرار، لازم است که بدانیم چندبار لازم است تا فرایند را تکرار کنیم؛ بنابراین یک دانش پیشین برای تعداد دفعات تکرار، مورد نیاز است. در حالی که می‌توان از الگوریتم بازگشتی بدون داشتن دانش پیشینی در مورد تعداد دفعات مورد نیاز برای اجرای الگوریتم، استفاده کرد.

دسته‌ای خاص از زبان‌های برنامه‌نویسی که به زبان‌های برنامه‌نویسی تابعی معروف هستند، به گونه‌ای طراحی شده‌اند که امکان تکرار صریح مجموعه‌ای از دستور را در قالبی مانند حلقه *for* فراهم نمی‌کنند*.* در عوض، این دسته از زبان‌های برنامه‌نویسی تنها و تنها از بازگشت استفاده می‌کنند. به جای فراخوانی یک بلوک کد برای تکرار با تعداد بارهای از پیش تعریف شده، بلوک کد اجرایی فعالیت دلخواه ما را را به تعدادی ریزفعالیت کوچکتر و مستقل *می‌شکند*، پس از آن بلوک کد روی هر ریزفعالیت اجرا می‌شود. هر ریزفعالیت به‌طور مکرر شکسته خواهد شد تا زمانی که «حجم» ریزفعالیت به اندازه‌ای کوچک شود که الگوریتم بتواند آن را خیلی سریع انجام دهد. سپس، الگوریتم به عقب برمی‌گردد و نتیجهٔ ریزفعالیت‌ها را در کنار یکدیگر قرار می‌دهد تا نتیجهٔ فعالیت اصلی را به دست آورد.

برای مثال، می‌توان به مرتب‌سازی ادغامی اشاره کرد که یکی از الگوریتم‌های مرتب‌سازی لیست است. الگوریتم بازگشتی مرتب‌سازی ادغامی در ابتدا لیست را به جفت‌های متوالی تقسیم می‌کند و این کار را آن قدر انجام می‌دهد تا جفت‌های متوالی قابل تقسیم نباشند. سپس هر جفت مرتب می‌شود، سپس هر دو جفت متوالی را مرتب می‌کند و به یکدیگر می‌چسباند و همین‌طور ادامه می‌دهد تا زمانی که عناصر لیست به ترتیب دلخواه برسند.

کد زیر مثالی از الگوریتم بازگشتی است که با زبان برنامه‌نویسی اسکیم نوشته شده‌است. این کد، خروجی مشابه با شبه‌کد قسمت قبل می‌دهد.
```scheme
(let iterate ((i 1) (a 0))
  (if (<= i 3)
    (iterate (+ i 1) (+ a i))
    (display a)))
```


## اصطلاحات دیگر
در برنامه‌نویسی شیءگرا، ایتریتور شیئی است که اطمینان حاصل می‌کند تکرار برای طیف وسیعی از داده‌ساختارهای مختلف به شکلی مشابه اجرا می‌شود. بدین ترتیب، سبب صرفه‌جویی در زمان و توان برنامه‌نویس در کدنویسی‌های بعدی خواهد شد. به‌طور خاص، ایتریتور به فرد این امکان را می‌دهد که عملیاتی یکسان را در هر عضو از داده‌ساختار تکرار کند. اغلب، ترتیبی از پیش تعریف شده برای این تکرار وجود دارد.

## آموزش
در برخی از دانشگاه‌های علوم تربیتی، از **تکرار** برای اشاره به این فرایند استفاده می‌شود: «آموزش‌دادن یا راهنمایی‌کردن دانش‌آموزان برای این که آزمایش‌ها، تمرین‌ها یا پروژه‌های خود را تا هنگام رسیدن به نتایج دقیق یا تسلط به یک مهارت فنی، تکرار کنند». این طرح در ضرب‌المثل قدیمی

*«کار نیکو کردن از پر کردن است»* یافت می‌شود. به‌طور خاص، *تکرارپذیر* بدین صورت تعریف می‌شود: «فرایندی برای یادگیری و رشد شامل کارهای متناوب: پرس‌وجو، فراهم کردن فرصت‌های کافی برای افراد به منظور بررسی مجدد طرح‌های خود، تفکر کردن نقادانه در باب پیامدهای آن.»

برخلاف رایانش و ریاضیات، تعداد دفعات تکرار از پیش معلوم نیست و تکرار تا زمانی که موفقیت بر اساس معیارهای استاندارد (معمولاً یک آزمون) حاصل شود، ادامه می‌یابد.

## جستارهای وابسته
* بازگشت
* فراکتال
* توابع مکرر
*الگوی تکرار

## منابع

* 

رده:تکرار در برنامه‌نویسی
رده:برخال‌ها
رده:مدیریت زمان
رده:مقاله‌های دارای کد مثال اسکیم (زبان برنامه‌نویسی)
رده:واژگان برنامه‌نویسی
رده:الگوریتم‌ها