
Информатика: создаём своего цифрового помощника Урок 23 из 26
Повторение без копирования и условие остановки
Научимся проходить все задачи без копирования команд и докажем, что повторение заканчивается.
Где мы на карте
Это третий блок одного проекта. Мы пользуемся данными версии 0.2, но пока описываем действия на бумаге: так можно обнаружить ошибку до написания Python.
Ситуация и вопрос
У помощника три задачи. Написать три команды «проверь задачу» легко. Но завтра задач станет тридцать, и копировать команду тридцать раз уже нелепо. Нам нужен один повторяемый шаг и ясный момент остановки.
Новые слова без пропусков
Цикл повторяет действие, пока есть элементы или выполнено условие. Итерация — один проход цикла. Счётчик хранит число уже обработанных элементов. Условие остановки говорит, когда повторение закончится. Инвариант цикла — утверждение, истинное до и после каждого прохода: «все записи до текущей позиции уже проверены, а остальные ещё нет». Бесконечный цикл получается, если условие выхода никогда не наступает, например позиция не увеличивается. Пустой список — важный тест: цикл должен закончиться без ошибок и дать ноль выполненных задач.
Опорный сигнал
позиция = 0 → пока позиция < длина → обработать → позиция + 1 → стоп
Разбираем шаг за шагом
Пусть у t-01, t-02, t-03 значения done равны false, true, false. Начало: position=0, completed=0. Первый проход: false, счётчик остаётся 0, позиция 1. Второй: true, счётчик 1, позиция 2. Третий: false, счётчик 1, позиция 3. Теперь position < 3 ложно, ответ 1. После каждого прохода проверяйте инвариант: счётчик равен числу true только в уже просмотренной части. Если увеличить позицию до чтения, первая задача пропадёт. Если не увеличить вовсе, цикл не завершится.
Проверка руками
Разложите три карточки false, true, false в ряд и передвигайте фишку позиции только вправо. До каждого шага скажите вслух, сколько карточек уже обработано и сколько true найдено; после шага проверьте оба числа. На позиции 3 необработанных карточек нет: дальше двигаться нельзя. Повторите с пустым рядом: позиция уже равна длине, значит цикл не начинается. Эти два опыта показывают и инвариант, и остановку без необходимости верить рисунку на слово.
Предскажите и проверьте
Каков результат для пустого списка? Ноль: условие ложно сразу. Для true, true, true — 3. Для false, false, false — 0. Предскажите, сколько проходов будет при четырёх записях: ровно четыре, если индекс меняется один раз за проход.
Поймайте ошибку
«Чтобы не пропустить последнюю запись, пишем position <= length». При позиции, равной длине, записи уже нет: допустимые индексы от 0 до length − 1. Исправьте знак и проверьте список из одного элемента.
Перенос в новую ситуацию
Вместо подсчёта завершённых задач найдите первую невыполненную. Можно ли закончить раньше конца списка? Да, если условие результата уже выполнено; объясните, почему такой ранний выход не подходит для подсчёта всех завершённых.
Изменение проекта
Запишите в ALGORITHM-ru.md цикл подсчёта done=true с таблицей трёх проходов. Добавьте инвариант и условие выхода. Проверьте пустой список, один элемент и три исходные задачи. Алгоритм пока читает данные, но не меняет tasks.json.
Задание и доказательство
Создайте трассы для false,true,false и пустого списка. Намеренно уберите увеличение позиции и укажите, где доказательство остановки ломается. Доказательство: таблица, инвариант и исправленный цикл.
Возврат через 1, 7 и 30 дней
Завтра объясните, почему пустой список безопасен. Через семь дней проследите поиск первого невыполненного. Через месяц найдите цикл в своём коде и проверьте его остановку.
Следующий урок: Функция как обещание: вход, результат и условия
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.