Бесконечные циклы
Если условие цикла while никогда не становится ложным, цикл никогда не заканчивается. Это называется бесконечным циклом, и это одна из самых частых ошибок с циклами. Здесь не хватает строки day = day + 1:
local day = 1
while day <= 3 do
print("День " .. day)
endday остаётся равным 1, условие day <= 3 всегда истинно, и программа снова и снова выводит День 1:
День 1
День 1
День 1
День 1
...На вашем собственном компьютере такая программа работала бы, пока вы её не остановите. На этом сайте её останавливают через 5 секунд, и вы видите сообщение Программа работала слишком долго и была остановлена. Нет ли в ней бесконечного цикла? То, что программа успела вывести, остаётся в выводе, так что видно, где она застряла. (Очень длинный вывод обрезается примерно после 100 000 символов и заканчивается знаком ….) Если цикл ничего не выводит, вы видите только это сообщение.
Когда вы его видите, проверьте каждый цикл: меняет ли что-нибудь в его блоке переменную из условия, чтобы в какой-то момент условие стало ложным? Типичные причины:
- Ничто не меняет переменную, как в примере выше.
- Переменная меняется не в ту сторону. В обратном отсчёте
while seeds > 0 doсо строкойseeds = seeds + 1вместоseeds = seeds - 1значениеseedsстановится всё больше и больше, поэтому условие остаётся истинным. - Изменение стоит после
end. Повторяется только код междуdoиend. Строка нижеendвыполнилась бы после цикла, а до этого дело не доходит. Отступы блока помогают увидеть, что находится внутри. - Опечатка слева от
=. Строкаseds = seeds - 1не меняетseeds. Lua не сообщает об ошибке: он молча создаёт новую глобальную переменнуюseds, аseedsнавсегда остаётся прежней. - Условие «промахивается» мимо цели. Условие с
~=(не равно) истинно для любого числа, кроме одного. Если переменная перепрыгивает через это число, цикл продолжается вечно. Поэтому в циклах со счётчиком обычно используют<,<=,>или>=: они останавливаются, даже если переменная проскочила предел.
В программе в редакторе есть цикл с ~=. Сейчас он работает, потому что plot растёт на 1 и точно попадает в 10. Посмотрим, что будет, если он станет расти на 2.
Задание
- 1
Вчера дождь полил грядки с чётными номерами, поэтому сегодня Эмма поливает только нечётные: 1, 3, 5, 7 и 9. Измените строку
plot = plot + 1так, чтобыplotросло на 2, и запустите программу. Сама она не останавливается, и через 5 секунд её прерывают. Посмотрите на вывод: через какие числа проходитplotи почему условие никогда не становится ложным? Затем исправьте условие, чтобы программа выводила:Полив грядки 1 Полив грядки 3 Полив грядки 5 Полив грядки 7 Полив грядки 9 Готово - 2
Ярмарка через 3 дня. Под программой создайте локальную переменную
daysLeftсо значением3и напишите циклwhile, который выполняется, покаdaysLeftбольше0. Внутри выведитеДней до ярмарки:и значениеdaysLeft, а затем уменьшитеdaysLeftна 1. (Если вместо этого прибавлять 1, цикл никогда не закончится.) После цикла выведитеДень ярмарки!. Конец вывода такой:Дней до ярмарки: 3 Дней до ярмарки: 2 Дней до ярмарки: 1 День ярмарки!