Это не хвостовая рекурсия, если что. При хвостовой рекурсии все фреймы вызовов имеют постоянный размер в памяти. Таким образом компилятор может оптимизировать их, переписывая их поверх друг друга. А тут на каждом якобы хвостовом вызове генерится новая строка.
sim3x: считай, что он есть в будущем и твой код выполняется на нём. Он и даже не в плане рекурсии затратен. Можно просто представить, что эта строка будет на сотню мегабайт и что? ты будешь на каждом шаге генерить ещё сотню мегабайт. И так у тебя просто программа съест оперативку и система начнёт юзать свап, а это всё очень тормозное.
sim3x: я не понял, что ему надо, поэтому как бы десять кодов ему писать, а потом выяснить, что они все неправильные, как-то не хочется.
Зайди сюда, там можно подучиться правильной рекурсии.
Если же исправлять твой код вот этот с созданием среза (будем считать, что мы знаем, что пишем ему). Ну, во-первых, рекурсия в питоне ограничена через лимит
>>> sys.getrecursionlimit()
1000
>>>
то есть это, считай, в функцию должны подаваться уже только короткие строки или же надо лезть в настройки рекурсии, что обычно не делают. А во-вторых, если и делать рекурсию, то она должна принимать текущий индекс в строке и просто его менять, а он много не жрёт, потому что это просто число одно. Если же полностью переделывать твой код, то это нужно сделать обычный цикл, тогда он не будет память жрать и не будет ограничен короткими строкам (то есть любые можно будет подавать).