Shanraq.org Shanraq.org
Повторение без копирования и условие остановки
Общество

Информатика: создаём своего цифрового помощника Урок 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)

Пока нет комментариев. Будьте первым.