У функции есть условие остановки, но выполнение до него не доходит. Например, вычитать из числа по два и ждать нуля бесполезно, если начали с нечётного числа.
Нужно проверить и базовый случай, и движение к нему. В примере сумма цифр вычисляется так:
def digit_sum(n):
if n < 0:
return digit_sum(-n)
if n < 10:
return n
return n % 10 + digit_sum(n // 10)
print(digit_sum(1234)) # 10
Для целого неотрицательного числа деление на 10 сокращает задачу, пока не останется одна цифра. Вызовы ждут результатов друг друга и занимают место в стеке.
В учебном разборе рекурсии есть задачи на вложенные списки и повторяющиеся подзадачи. Увеличение лимита рекурсии не исправляет алгоритм, который не приближается к остановке.
