Ниже приведен пример того, как вы можете использовать довольно простую задачу и превратить ее в отличную лекцию, касающуюся многих различных аспектов. Мы сосредоточимся на сложной задаче, так как она немного усложняет ее.
Мой первый фрагмент кода был следующим:
Это неплохое рекурсивное решение, но человеку, который дал мне задание, оно не понравилось:
без использования понимания списка, прерывания/продолжения, функций, модулей и других дополнительных вещей
Хорошо, мое решение было слишком продвинутым. Мой следующий подход состоял в том, чтобы проверить список для сортировки. Это легко сделать, просмотрев список и проверив, является ли следующий элемент выше/ниже предыдущего:
Я имею в виду, что расширенная версия хочет, чтобы она была общей, а не жестко запрограммированной.
Опять неправильно.
Эта проблема может быть легко решена без жесткого кодирования переменной направления.
это может сработать да
Мы сделали это!
А вот это решение мне не понравилось. Внутри цикла вообще говоря слишком много условий и любому программисту приходится утомительно просматривать их все, чтобы понять, что происходит, так что давайте посмотрим, что мы можем улучшить:
Тада!!
Теперь у нас есть только одно условие:
!= обозначает оператор XOR, который верен только в том случае, если оба не совпадают:
Если направление равно True, то элементы должны располагаться по возрастанию (предыдущее ‹ текущее)
Если направление равно False, то элементы должны быть по убыванию (предыдущее › текущее)
После того, как мы решили эту небольшую задачу, другой человек прокомментировал:
Что ж, сначала отсортируйте массив и проверьте, равен ли список, будет ли он обратным или самим собой. И отсортировать его с помощью циклов
Вы можете говорить, что хотите, но это правильное решение проблемы, тем не менее, оно открывает дискуссию о сложности, если считать n количеством элементов в списке:
- Метод рекурсии имел O(n)-сложность
Он может вызывать функцию не более n раз. - Метод цикла while имел сложность O(n)
Цикл выполняется максимально n раз. - Последний подход имел O(n*log(n))
Эта сложность выше, потому что сначала сортируется список. В зависимости от вашего метода сортировки это может быть быстрее/медленнее:
Чему нас научило это небольшое задание?
Как видите, вы можете превратить простую задачу в гораздо более сложные задания, просто изменив путь к решению. Кроме того, вы можете создать отличную дискуссию, если изучите:
- читаемый код (лучшее логическое уравнение)
- эффективность (теория сложности)
- эффективность памяти
Я надеюсь, что смогу изменить ваше мнение о том, как вы смотрите на простые задачи с этого момента, и о том, что с созданием новых условий каждая маленькая задача может стать вашим самым большим вызовом.
Если у вас есть какие-либо вопросы или рекомендации, вы всегда можете найти меня через мой адрес электронной почты или в нашем сообществе:
Artificialis: Сервер сообщества Discord, полный энтузиастов и профессионалов ИИ
Наш информационный бюллетень, еженедельные новости о нашей работе, новости из мира ИИ, учебные пособия и многое другое!