- Не называйте вашу функцию
sum
, она затеняет встроенную функцию Реализуйте вашу функцию, чтобы четко определить базовый случай и рекурсивный случай.
Для базового случая, когда длина равна 1, вернуть этот элемент.Вы правильно поняли.
Для рекурсивного случая разделите ваш список на половину и рекурсивно вычислите сумму для каждой половины.
def sum_recursive(L):
if len(L) == 1:
return L[0]
idx = len(L) // 2
return sum_recursive(L[:idx]) + sum_recursive(L[idx:])
sum_recursive
всегда должен получать список и возвращать целое число.
Некоторые пробные прогоны:
In [5]: sum_recursive([1, 2, 4, 8])
Out[5]: 15
In [6]: sum_recursive([2, 4])
Out[6]: 6
Имейте в виду, что это не сможет обрабатывать пустые списки в качестве входных данных.Если вы также хотите учесть это, измените свой базовый случай на:
def sum_recursive(L):
if len(L) <= 1:
return sum(L)
...
Мы используем встроенную функцию sum
, которая изящно обрабатывает пустые списки, возвращая 0. Для одно-списки элементов, возвращается первый элемент (также важно, чтобы вы не скрывали эти служебные функции).
Если вы не хотите использовать sum
, вам нужноразделите ваш базовый случай на две части:
def sum_recursive(L):
if len(L) == 0:
return 0
elif len(L) == 1:
return L[0]
...