Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке цикл з передумовою?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Цикл з передумовою** - це цикл, який перед кожною ітерацією спочатку перевіряє логічну умову, і тільки якщо вона істинна, виконує тіло циклу. Класичний приклад - оператор while; якщо умова хибна із самого початку, тіло циклу не виконається жодного разу. - Перевірка умови - до виконання тіла. - Кількість ітерацій заздалегідь невідома. - Типові приклади: while, for з умовою в заголовку. **Ключове:** гнучкий, коли кількість повторів залежить від даних під час виконання, але зупинку гарантує лише умова, яка рано чи пізно стане хибною.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що таке цикл з передумовою? ### Коротка відповідь Цикл з передумовою - це цикл, який перед кожною ітерацією спочатку перевіряє логічну умову, і тільки якщо вона істинна, виконує тіло циклу. Класичний приклад - оператор while; якщо умова хибна із самого початку, тіло циклу не виконається жодного разу. - Перевірка умови - до виконання тіла. - Кількість ітерацій заздалегідь невідома. - Типові приклади: while, for з умовою в заголовку. ### Докладний розбір #### Визначення і загальна ідея Цикл з передумовою організований так, що вхід у тіло циклу можливий лише за істинності умови. На кожному кроці умова перераховується заново, що дозволяє перервати цикл, щойно мету досягнуто (або дані закінчилися). #### Базовий синтаксис (на прикладі JavaScript) ``` while (condition) { // тіло циклу // змініть дані/лічильники так, щоб condition у якийсь момент стало хибним } ``` #### Ключові властивості - Тіло може не виконатися жодного разу (якщо умова хибна одразу). - Зупинка гарантована, якщо умова рано чи пізно стане хибною. - Гнучкий, коли кількість повторів залежить від даних під час виконання. #### Порядок виконання 1. Обчислити condition. 2. Якщо condition істинна - виконати тіло. 3. Повторити з кроку 1. #### Приклади коду ##### JS: пошук першого від'ємного числа в масиві ``` const arr = [3, 5, 8, 0, -2, 10]; let i = 0; let firstNegative = null; while (i < arr.length && firstNegative === null) { if (arr[i] < 0) { firstNegative = arr[i]; } else { i += 1; // важливо оновлювати лічильник, інакше цикл буде нескінченним } } console.log(firstNegative); // -2 ``` ##### JS (неблокуючий): очікування умови з таймаутом У браузерному/Node.js коді не можна крутити "порожній" while для очікування - він блокує потік. Замість цього використовуйте await всередині циклу: ``` async function waitFor(predicate, timeoutMs = 2000, intervalMs = 50) { const end = Date.now() + timeoutMs; while (!predicate()) { // передумова перевіряється перед кожною ітерацією if (Date.now() > end) throw new Error('Timeout'); await new Promise(r => setTimeout(r, intervalMs)); } } // Приклад використання: чекаємо, поки на сторінці з'явиться елемент // await waitFor(() => !!document.querySelector('#app-ready')); ``` #### Різниця з циклом з постумовою (do...while) Цикл з постумовою перевіряє умову після виконання тіла, тому тіло виконується мінімум один раз. ``` // Передумова (while): тіло може не виконатися let n = 0; while (n > 0) { console.log('Не виведеться'); } // Постумова (do...while): тіло виконається хоча б один раз let m = 0; do { console.log('Виконається один раз'); } while (m > 0); ``` #### Типові помилки і як їх уникнути - Нескінченний цикл: забули змінити змінні, що впливають на умову. Рішення: оновлюйте лічильники/стан усередині тіла циклу або використовуйте for, якщо доречно. - Порівняння чисел із рухомою крапкою на рівність. Рішення: перевіряйте через діапазон (|a-b| < eps) або використовуйте порівняння >/<. - Мутація колекції під час обходу (зміна довжини масиву під час ітерації). Рішення: ітеруйтеся по копії або контролюйте індекс і межі. - Блокування UI/сервера в JS довгим синхронним while. Рішення: розбивайте роботу на частини (setTimeout/queueMicrotask) або використовуйте await всередині циклу. - Занадто складна умова, важко підтримувати. Рішення: винесіть перевірку у функцію з промовистою назвою (isReady(), hasMore()). #### Інваріант і завершення (для співбесід) Інваріант - властивість, істинна до і після кожної ітерації. Для коректності циклу сформулюйте: - Інваріант: що не змінюється (наприклад, «усі оброблені елементи задовольняють умову»). - Міра прогресу: що монотонно наближає до завершення (індекс зростає, черга зменшується, час спливає). - Умова виходу: коли і чому вона стане хибною. #### Коли використовувати - Кількість повторень заздалегідь невідома і залежить від даних/подій. - Потрібно перевіряти умову до виконання кроку (наприклад, чи є ще дані). - Читання з потоку/черги до спорожнення, пошук до знаходження результату, очікування стану. ### Підсумок Цикл з передумовою (наприклад, while) перевіряє умову до входу в тіло, тому тіло виконується тільки якщо умова істинна. Це зручний інструмент для задач із заздалегідь невідомою кількістю ітерацій; важливо забезпечити зміну стану, що веде до хибності умови, щоб уникнути нескінченних циклів.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.