Во-первых, @Blorgbeard прав, не делай этого.Это ужасный анти-паттерн.
Но чтобы ответить на ваш главный вопрос: причина, по которой ваш фрагмент не сработал даже для небольших случаев, заключается в том, как вы сделали рекурсию:
recursion(in_list, output_list)
Если вселенная живет, то в какой-то момент это действительно выдает RuntimeError
(точнее RecursionError
) за превышение предела рекурсии (который не очень велик; в моей тестовой среде это было 2961, так что нене ожидайте, что это решит любые большие случаи правильно).Это означает, что какой-то экземпляр этого вызова вернет True
.Однако это возвращаемое значение невидимо, и вмещающая функция завершает работу, ничего не возвращая, что означает, что она возвращает None
.
Чтобы правильно поймать RecursionError
, либо введите try
- catch
заблокируйте рекурсивную функцию или передайте любое другое значение в стек следующим образом:
return recursion(in_list, output_list)
Это дает правильное возвращаемое значение для небольших случаев, которые вы указали.
Что вы действительно должны сделать, тем не менее, это признать, что вы еще не знаете эффективного алгоритма для решения этой проблемы (постановка задачи допускает до 200000 символов в каждом входном случае).Поэтому вы должны распечатать все состояния, через которые проходит определенный ввод, и искать шаблоны.
Возможно, эта проблема слишком сложна для вас, и вы должны либо отказаться от нее, либо найти описаниеалгоритма в Интернете, если вы считаете, что практика программирования важнее для вас.Опять же, для этого не требуется никаких алгоритмических знаний (кроме базовых вещей, таких как рекурсия), а также никаких математических знаний (кроме базовых вещей, таких как четность), поэтому это может быть хорошим упражнением.