ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Минимум и максимум в Python без готовых функций

Автор: · Обновлено

Поиск экстремума хранит лучший элемент среди уже просмотренных. Первое реальное значение становится начальным кандидатом; каждый следующий элемент сравнивается с ним и при…

Поиск экстремума хранит лучший элемент среди уже просмотренных. Первое реальное значение становится начальным кандидатом; каждый следующий элемент сравнивается с ним и при необходимости заменяет его. Такой алгоритм работает за один проход и не требует сортировки.

Кандидат из данных, а не случайное число

temperatures = [-8, -3, -11, -5]
maximum = temperatures[0]

for value in temperatures[1:]:
    if value > maximum:
        maximum = value

print('Самая высокая:', maximum)

Результат:

Самая высокая: -3

Начальное maximum = 0 дало бы неверный ответ, потому что нуля в данных нет и все температуры отрицательные. Первый элемент гарантирует, что кандидат принадлежит последовательности.

Пустая последовательность

Обращение temperatures[0] невозможно для пустого списка и вызывает IndexError. Условие задачи должно гарантировать хотя бы один элемент либо программа должна отдельно обработать отсутствие данных. Готовые функции min и max тоже не принимают пустую последовательность без значения default в подходящих сценариях.

Для минимума достаточно поменять знак сравнения на <. Если нужен индекс лучшего элемента, храните одновременно best_index и best_value. При равенстве выбор > сохраняет первое вхождение, а >= — последнее; это важная деталь условия.

Рекорд и его позиция

Для списка [4, 9, 2, 9, 5] найдите максимальное значение и индекс его первого появления без max и index. Ожидаются 9 и индекс 1. Проверьте список из одного элемента и набор отрицательных чисел. Нарисуйте трассировку кандидата после каждого сравнения. Затем измените оператор так, чтобы сохранялось последнее появление максимума, и объясните изменение результата.

Стабильность при равенстве

Ищите максимум не только числа, но и пару «балл, имя». Решите заранее, должен побеждать первый или последний участник с одинаковым баллом, и выберите оператор сравнения соответственно. Протестируйте список, где рекорд повторяется в начале и конце. Затем добавьте сохранение индекса и убедитесь, что значение и позиция обновляются вместе. Ошибка, при которой меняется только максимум, а индекс остаётся старым, легко обнаруживается таким набором. В итоге сформулируйте инвариант: сохранённая пара описывает лучший элемент среди уже просмотренной части списка.

Практикум: экстремумы среди отрицательных значений

Найдите минимум и максимум списка -8, -3, -12, -4 без встроенных функций. Инициализируйте оба первым элементом и перебирайте оставшиеся. Запишите таблицу изменения значений. Сравните с неверной инициализацией нулём и покажите, какой ответ искажается. Для пустого списка определите явное поведение до обращения к первому элементу. Затем добавьте индекс первого максимума, не меняя его при равном значении, и протестируйте повторы.

Контрольная точка

Какой инвариант верен после обработки первых k элементов? Максимум должен принадлежать обработанному префиксу и быть не меньше каждого его значения; это объясняет и начальную установку.

Частые вопросы

Почему нельзя всегда начинать максимум с очень маленького числа?

Можно использовать специальную бесконечность для числового контракта, но первый реальный элемент проще и сохраняет тип. Произвольная константа рискует оказаться больше допустимых данных и дать несуществующий ответ.

Источники