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