Цикл repeat
Цикл while проверяет условие перед каждой итерацией. Если условие ложно с самого начала, блок не выполняется ни разу. В Lua есть ещё один цикл, repeat … until, который проверяет условие после каждой итерации:
local water = 0
repeat
water = water + 8
print("Воды в поилке: " .. water)
until water >= 20Воды в поилке: 8
Воды в поилке: 16
Воды в поилке: 24Блок находится между repeat и until, а условие стоит в самом конце. Здесь нет ни do, ни end: цикл закрывает until с условием. Следите за смыслом условия: while выполняется, пока условие истинно, а repeat выполняется до тех пор, пока условие не станет истинным. Как только water >= 20 становится истинным, цикл останавливается.
Разница видна, когда поилка с самого начала полна:
local water = 30
repeat
water = water + 8
print("Воды в поилке: " .. water)
until water >= 20Воды в поилке: 38Блок выполняется один раз, и только потом цикл выясняет, что пора остановиться. Поилка переполнена. Цикл while water < 20 do не добавил бы ни капли воды. Поэтому используйте repeat только тогда, когда блок должен выполниться хотя бы один раз.
Когда так бывает? Например, когда вы считаете цифры в числе. Целочисленное деление на 10 отбрасывает последнюю цифру (1250 // 10 равно 125), поэтому можно делить, пока ничего не останется: 1250, 125, 12, 1, 0. Это четыре деления, значит, в числе 1250 четыре цифры. Число 0 тоже записывается одной цифрой, и repeat гарантирует, что у него будет своё одно деление. Вы попробуете это в упражнении.
Есть ещё одна вещь, доступная только repeat: условие после until может использовать локальную переменную, созданную внутри блока. Куры Эммы несут 4 яйца в день. За сколько дней наберётся хотя бы 10 яиц?
local day = 0
repeat
day = day + 1
local eggs = day * 4
print("День " .. day .. ", яйца: " .. eggs)
until eggs >= 10День 1, яйца: 4
День 2, яйца: 8
День 3, яйца: 12В цикле while так сделать нельзя: его условие стоит перед блоком, где переменной eggs ещё нет.
Задание
- 1
Программа считает цифры в
coins. Запустите её: она выводитЦифр: 0, но число 0 записывается одной цифрой. Перепишите циклwhileкак циклrepeat, который повторяется, покаcoinsне станет равно0. Тогда программа выведетЦифр: 1. - 2
Проверьте, что цикл по-прежнему работает для других чисел: измените значение
coinsна1250. Программа выводит:Цифр: 4