Skip to main content

Що таке цикл з передумовою?

Що таке цикл з передумовою?

Коротка відповідь

Цикл з передумовою - це цикл, який перед кожною ітерацією спочатку перевіряє логічну умову, і тільки якщо вона істинна, виконує тіло циклу. Класичний приклад - оператор 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) перевіряє умову до входу в тіло, тому тіло виконується тільки якщо умова істинна. Це зручний інструмент для задач із заздалегідь невідомою кількістю ітерацій; важливо забезпечити зміну стану, що веде до хибності умови, щоб уникнути нескінченних циклів.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.