Що таке цикл з передумовою?
Що таке цикл з передумовою?
Коротка відповідь
Цикл з передумовою - це цикл, який перед кожною ітерацією спочатку перевіряє логічну умову, і тільки якщо вона істинна, виконує тіло циклу. Класичний приклад - оператор while; якщо умова хибна із самого початку, тіло циклу не виконається жодного разу.
- Перевірка умови - до виконання тіла.
- Кількість ітерацій заздалегідь невідома.
- Типові приклади: while, for з умовою в заголовку.
Докладний розбір
Визначення і загальна ідея
Цикл з передумовою організований так, що вхід у тіло циклу можливий лише за істинності умови. На кожному кроці умова перераховується заново, що дозволяє перервати цикл, щойно мету досягнуто (або дані закінчилися).
Базовий синтаксис (на прикладі JavaScript)
while (condition) {
// тіло циклу
// змініть дані/лічильники так, щоб condition у якийсь момент стало хибним
}Ключові властивості
- Тіло може не виконатися жодного разу (якщо умова хибна одразу).
- Зупинка гарантована, якщо умова рано чи пізно стане хибною.
- Гнучкий, коли кількість повторів залежить від даних під час виконання.
Порядок виконання
- Обчислити condition.
- Якщо condition істинна - виконати тіло.
- Повторити з кроку 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); // -2JS (неблокуючий): очікування умови з таймаутом
У браузерному/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) перевіряє умову до входу в тіло, тому тіло виконується тільки якщо умова істинна. Це зручний інструмент для задач із заздалегідь невідомою кількістю ітерацій; важливо забезпечити зміну стану, що веде до хибності умови, щоб уникнути нескінченних циклів.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.