← Маршрут ML-инженерии

Урок · 2 мин чтения · упражнения и самопроверка

Поиск ошибок

После урока: объяснить воспроизведение и выполнить упражнение «Найти и исправить ошибку границы цикла», обосновав выбранный подход..

Перед началом

Сделайте ошибку наблюдаемой

Сохраните три значения: вход, ожидаемый результат, фактический результат. Если программа падает, сохраните также сообщение ошибки. Повторяемый пример полезнее описания «иногда не работает».

Уменьшайте вход, пока неверное поведение сохраняется. Если ошибка связана с концом диапазона, часто достаточно n = 1. Для индексов массива проверьте один элемент и пустой массив, если он разрешён. Для сравнения чисел — равенство и отрицательные значения.

Ручная трассировка

Запишите состояния переменных по шагам. В сумме 1 + 2 + 3 накопитель меняется 0 → 1 → 3 → 6. В Python range(1, n) не включает n; правильный диапазон для этой суммы — range(1, n + 1). В C++ условие i <= n включает последнюю границу.

Сначала проверьте чтение и вывод, затем границы, порядок обновления и типы. Объясните, почему исправление работает для всех допустимых значений, а не только для найденного теста. Добавьте этот тест в постоянную проверку, чтобы ошибка не вернулась.

Отладочный вывод

В локальном проекте можно временно печатать промежуточные состояния в stderr. Для отправки оставьте в stdout только требуемый ответ. В C++ проверки границ через vector.at и инструменты диагностики помогают найти неверный индекс; при переходе к быстрому доступу всё равно необходимо обоснование границ.

Если исправление меняет алгоритм, повторно оцените время и память. Иногда проверка ошибки показывает, что сам выбранный подход неприменим к ограничениям.

Пошаговый пример

python
n = 3
total = 0
for i in range(1, n + 1):
    total += i
print(total)

Ожидаемый вывод

text
6

После i=1 сумма 1, после i=2 сумма 3, после i=3 сумма 6.

Сделайте самостоятельно

В ошибочном цикле range(1, n) найдите минимальный положительный n, при котором результат отличается от суммы от 1 до n.

Ответ и критерии проверки

n = 1. Цикл не выполнится, получится 0 вместо 1. Тест n = 1 должен остаться после исправления.

Проверьте понимание

1. Что такое минимальный воспроизводимый пример?
2. Включает ли range(1, 4) число 4?