В приведённом фрагменте кода на Python: def find_max(arr): max=0; for x in arr: if x>max: max=x; return max — выявите все возможные ошибки и предложите исправления для общих случаев (пустой список, отрицательные числа), укажите временную сложность

1 Июн в 16:58
15 +1
0
Ответы
1
Ошибки и недостатки исходного фрагмента
- Переменная называется `max` — перекрывает встроенную функцию `max()`. Исправление: использовать другое имя, например `max_val`.
- Инициализация `max = 0` неверна для общих случаев: если все элементы отрицательны, результат будет ошибочным. Исправление: инициализировать первым элементом последовательности.
- Не обработан пустой список — при инициализации от `arr[0]` будет IndexError; нужно явно обработать пустую последовательность (например, бросать `ValueError` или возвращать `None`).
- Код не учитывает произвольные итерируемые объекты (работает только с индексируемыми) — лучше взять итератор и читать первый элемент через `next()`.
- Возможны ошибки при несравнимых типах (например, числа и строки) — либо проверять типы, либо позволять исключению появиться.
- Стиль: использование `;` и одномерной записи ухудшает читабельность.
Исправленные варианты
1) Для списка (raise при пустом):
```
def find_max(arr):
if not arr:
raise ValueError("find_max() arg is an empty sequence")
max_val = arr[0]
for x in arr[1:]:
if x > max_val:
max_val = x
return max_val
```
2) Для общей итерируемой последовательности (работает с итераторами):
```
def find_max(iterable):
it = iter(iterable)
try:
max_val = next(it)
except StopIteration:
raise ValueError("find_max() arg is an empty iterable")
for x in it:
if x > max_val:
max_val = x
return max_val
```
3) Короткий вариант с встроенным `max` (если приемлемо использовать встроенное и/или возвращать значение по умолчанию):
- бросить исключение при пустом: `return max(arr)` — встроенная `max` сама бросит `ValueError` для пустых.
- вернуть `None` по умолчанию: `return max(arr, default=None)`.
Сравнение и сложности
- Временная сложность: Θ(n)\Theta(n)Θ(n), где n=n =n= длина входной последовательности (нужно примерно n−1n-1n−1 сравнений).
- Память: Θ(1)\Theta(1)Θ(1) дополнительной памяти.
1 Июн в 17:39
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир