Ответы Mail.ru: В чем разница двух кодов, один рабочий - другой нет, хотя на мой взгляд, по сути, делается одно и то же?

Chromatic Scale (122617) 5 дней назад

Ваша ошибка в первом коде заключается в использовании функции `max` с некорректными параметрами для сравнения. Функция `max` используется для нахождения максимального элемента из переданных ей значений. Однако, в вашем случае, вы сравниваете два списка, что приводит к неочевидному результату сравнения, зависящему от первых элементов списков. Если первый элемент одного списка больше другого, то этот список будет выбран, независимо от других значений в списке.

Давайте разберемся на вашем примере:

В первом коде вы пишете:
```python
mmax = max(mmax, [len(d), x])
```
Это строка пытается сравнить текущий список `mmax` с новым списком `[len(d), x]`. Сравнение идет лексикографически, начиная с первого элемента списка. Если `mmax` изначально пуст, то любой первый список будет максимальным до тех пор, пока не встретится другой список с большим первым элементом. Это может привести к тому, что вы не обновляете `mmax`, когда находите число с таким же количеством делителей, но меньшим значением `x`.

Во втором, исправленном коде, используется явная проверка:
```python
if len(d) > max_len:
max_len = len(d)
mmax = [len(d), x]
```
Здесь, если число делителей `len(d)` больше, чем текущий максимум `max_len`, обновляется и максимальное значение `max_len`, и список `mmax`. Это обеспечивает корректное сравнение только по количеству делителей, и при равенстве количества делителей сохраняется минимальное `x` из-за последовательности проверок в цикле.

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

Светосколок в тьмеМыслитель

5 дней назад

Чтобы исправить ошибку в коде, используйте явную проверку вместо сравнения с помощью функции max:
 
if len(d) > max_len:
max_len = len(d)
mmax = [len(d), x]
 
В этом коде, если число делителей len(d) больше текущего максимума max_len, максимальное значение max_len обновляется, и список mmax заполняется соответствующим образом. Это обеспечивает корректное сравнение только по количеству делителей и сохраняет минимальное значение x при равенстве количества делителей.

правильно понял?

Ярик ГончарикУченик

5 дней назад

Спасибо, все очень понятно!) Я думал что когда сравниваются списки с количеством элементов > 1, то в случае если их 1 элементы равны, сравнение будет осуществляться по 2-ому элемнту.