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

Мой первый фрагмент кода был следующим:

Это неплохое рекурсивное решение, но человеку, который дал мне задание, оно не понравилось:

без использования понимания списка, прерывания/продолжения, функций, модулей и других дополнительных вещей

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

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

Опять неправильно.

Эта проблема может быть легко решена без жесткого кодирования переменной направления.

это может сработать да

Мы сделали это!

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

Тада!!

Теперь у нас есть только одно условие:

!= обозначает оператор XOR, который верен только в том случае, если оба не совпадают:

Если направление равно True, то элементы должны располагаться по возрастанию (предыдущее ‹ текущее)
Если направление равно False, то элементы должны быть по убыванию (предыдущее › текущее)

После того, как мы решили эту небольшую задачу, другой человек прокомментировал:

Что ж, сначала отсортируйте массив и проверьте, равен ли список, будет ли он обратным или самим собой. И отсортировать его с помощью циклов

Вы можете говорить, что хотите, но это правильное решение проблемы, тем не менее, оно открывает дискуссию о сложности, если считать n количеством элементов в списке:

  • Метод рекурсии имел O(n)-сложность
    Он может вызывать функцию не более n раз.
  • Метод цикла while имел сложность O(n)
    Цикл выполняется максимально n раз.
  • Последний подход имел O(n*log(n))
    Эта сложность выше, потому что сначала сортируется список. В зависимости от вашего метода сортировки это может быть быстрее/медленнее:

Чему нас научило это небольшое задание?

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

  • читаемый код (лучшее логическое уравнение)
  • эффективность (теория сложности)
  • эффективность памяти

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

Если у вас есть какие-либо вопросы или рекомендации, вы всегда можете найти меня через мой адрес электронной почты или в нашем сообществе:

Artificialis: Сервер сообщества Discord, полный энтузиастов и профессионалов ИИ

Наш информационный бюллетень, еженедельные новости о нашей работе, новости из мира ИИ, учебные пособия и многое другое!