Алгоритми з повторенням

Що потрібно зробити людині. щоб присісти? Потрібно зігнути ноги в колінах. Що потрібно щоб встати? Випрямити ноги. Що буде якщо ми кілька раз поспіль згинатимемо та розгинатимемо ноги? Відповідь очевидна - ми будемо присідати. Отже процес присідання зводиться до повторення лише двох описаних вище дій (команд). Що буде якщо робот який вміє виконувати дві команди "відставили ліву нову" і "приставити праву ногу" повторить цю дію кілька разів? Правильно він буде рухатись.

Зрозуміло, що для того, щоб робот подолав 100 кроків потрібно створити програму яка міститиме 200 команд (на один крок іде 2 команди). А скільки команд необхідно для трьох мільйонів кроків? Зрозуміло, що такий підхід не є ефективним і тому у житті людини і звичайно у житті машин з'явилося слово "повторити". Тепер для подолання 10 кроків не потрібні 20 команд. Достатньо сформувати конструкцію "Повтори 10 разів ( Відстав ліву ногу, Пристав праву ногу)". У ній дві команди будуть повторені 10 разів і робот при цьому подолає відстань у 10 кроків. 
Конструкції, що дозволяють повторювати одні і ті ж команди називають циклічними або цикл. Саме їх використовують програмісти у тих випадках, де потрібне повторення. Зміна положення ніг, обертання колес, політ птаха - це все повторення деяких команд. Що відбувається коли йде дощ? Звичайно з неба на землю падають мільярди краплинок. А чи можна створити імітацію дощу? Чи потрібно для цього створювати таку кількість краплинок? Подумайте як це можна реалізувати.

Види повторень

Цикл з лічильником
Уявімо задачу. Робот знаходиться на відстані 18 метрів від дверей. Скільки кроків він повинен виконати, щоб дійти до них? Для цього нам потрібно знати яку відстань він проходить за один крок. Якщо відстань одного кроку 2 метри, то неважко вирахувати, що повторень потрібно 9 (18:2 =9). Це означає, що відправляючи нашого робота на Марс ми повинні навчити його якось вимірювати відстані до об'єктів. Це задача інженерів і вони з нею справились добре, а значить і програміст матиме можливість нескладною математикою завжди порахувати кількість повторень яку треба виконати роботу. Для цього треба відстань до об'єкта розділити на довжину кроку робота.
Такий підхід дає нам змогу використати конструкцію повторень у якій ми наперед знаємо чи можемо визначити кількість повторень які треба виконати роботу для досягнення мети. У Scratch, як і у справжніх мовах програмування таку конструкцію називають цикл з лічильником. І виглядає він так.
Нескладно здогадатися, що всередині цього блоку повинні бути команди які і будуть повторюватись. Наприклад для нашого робота конструкція може бути такою:
В даному випадку ми фіксовано вказали кількість повторень. Але для нашого робота такий варіант не буде правильним. Адже відстані на Марсі можуть бути різними.
Тому спочатку потрібно визначити кількість повторень і вже потім використати їх як лічильник для циклічної конструкції. Познайомитись із робочим проектом можна за посиланням Робот на Марсі.

Для яких проектів можна використовувати цикл з лічильником? Ідей звичайно не перелічити, але найпростіші - це рух і послідовна зміна образів. Вже всі зрозуміли, що переміщення спрайта по сцені на певну відстань, відбувається миттєво. При цьому немає "плавності". В цьому випадку допоможе і допоможе повторення руху на невелику кількість кроків.
 
Цикл з передумовою
Отже цикл з лічильником зручний у випадку, коли ми можемо знати кількість повторень або порахувати їх математично. Але трапляються ситуації, коли для реалізації поставленої задачі потрібні повторення деяких простих команд, але визначити кількість повторень неможливо.
Прикладом може бути ситуація подана на малюнку нижче.

Метелик хоче долетіти до квітки, але як і у житті, наш метелик не наділений різного роду датчиків, окрім зору. Отже метелик бачить квітку, хоче до неї долетіти і для цього йому треба махати крилами. Але виникає питання, скільки разів треба опустити і підняти крило, щоб долетіти до квітки? На це питання він не зможе відповісти, але він буде це робити до тих пір доки доторкнеться квітки. Отже в цій ситуації кількість повторень (крило вгору, крило вниз) буде визначатися не наперед заданою командою, а умовою доторкання до квітки. Якщо ця умова виконалася - потрібно перестати махати крилами і почати збирати нектар.
Таким чином ми отримуємо ще одну конструкцію повторень - цикл з передумовою.
Передумова  являє собою висловлювання, схоже з тим які використовуються у розгалуженнях.

У Scratch він реалізований за допомогою конструкції

Цей блок містить контейнер для висловлювання якими часто теж бувають датчики і місце для команд, що будуть повторюватися. А тому для нашого метелика ми можемо створити скрипт у якому він буде махати крилами. 
У запропонованому алгоритві використано команди "Крило вгору" та "Крило вниз". Таких команд за замовчуванням не існує, але їх можна створити у розділі Мої блоки. І тоді для нашого метелика отримаємо повний алгоритм (клацніть для збільшення). 

Таким чином ми розглянули це один вид циклу який дозволить нам повторювати команди у тому випадку, коли порахувати точну кількість повторень складно, але існує умова якої можна досягнути після повторення кількох команд.

ПОДІЛИТИСЯ У FACEBOOK