I got the following problem: Let's consider the following encoding table:
0 -> A
1 -> B
2 -> C
...
- input: string containing a list of integers
 - output: int representing the number of words that can be encoded from the input
 - examples:
 
"0" -> 1 (word is A)
"10" -> 2 (words are BA and K)
"121" -> 3 (words are BCB, MB and BV) 
I wrote this algo
import string
sys.setrecursionlimit(100)  # limit the number of recursions to 100
# {0: 'a', 1: 'b', etc.}
dict_values = dict(zip(range(26), string.ascii_lowercase))
def count_split(list_numbers: list) -> int:
    if len(list_numbers) == 0:
        return 0
    elif len(list_numbers) == 1:
        return 1
    elif len(list_numbers) == 2:
        if int(list_numbers[0]) == 0:
            return 1
        elif 10 <= int("".join(list_numbers)) <= 25:
            return 2
        else:
            return 1
    else:  # list_numbers contains at least three elements
        if count_split(list_numbers[:2]) == 2:
            return count_split(list_numbers[1:]) + count_split(list_numbers[2:])
        else:
            return count_split(list_numbers[1:])
def get_nb_words(code: str) -> int:
    return count_split(list(code))
# print(get_nb_words("0124")) -> 3
# print(get_nb_words("124")) -> 3
# print(get_nb_words("368")) -> 1
# print(get_nb_words("322")) -> 2
# print(get_nb_words("12121212121212121212")) -> 10946
Surprisingly, this algo works on the last example "12121212121212121212". I expected the number of recursions to be exceeded because at each step, the function count_split is called twice on a list. Thus, the number of calls is much more than 100 (even more than 1000) !
In the meanwhile I found this post on stackoverflow saying that tail recursion is not optimized in Python, so I'm a bit suprised !
Could someone explain to me why the recursion limit is not exceed in this algorithm ?