def sum(L):
if len(L) == 1:
return L[0]
i = sum (len (L) // 2)
if len(L) > 1:
return i + i
L=[2,4]
print (sum(L))
когда я пытаюсь запустить его, есть объект TypeError: объект типа 'int' не имеет len().
Я думаю, что вы пытались написать рекурсивную функцию sum
которая непрерывно разбивает список на более мелкие куски. Таким образом, в основном то, что вам нужно сделать, это вычислить индекс средней точки, а затем использовать нарезку списка, чтобы передать первый подсписчик и второй подсписчик обратно в функцию, до тех пор, пока не удалите ваш базовый регистр из 0
или 1
элемента.
def add(values):
if len(values) == 0:
return 0
elif len(values) == 1:
return values[0]
mid = len(values)//2
return add(values[:mid]) + add(values[mid:])
>>> add([1,2,3,4,5])
15
В sum (len (L)//2)
вы передаете целое число (результат len(L)//2
) как аргумент L
вашей функции sum()
. (Пожалуйста, не предоставляйте функции с тем же именем, что и встроенные функции.) Рекурсивно называемая sum()
затем пытается оценить len(L) == 1
на этом целое число, но целые числа не поддерживают len()
и поэтому вы получите соответствующее сообщение об ошибке. Что именно вы на самом деле пытаетесь сделать?
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]
...
В вашем коде
я = sum (len (L)//2)
строка выдает ошибку, потому что в рекурсии после первого вызова sum() вы передаете целое число, а не список
def sum(L):
if len(L) == 0:
return 0
elif len(L) == 1:
return L[0]
else:
index = len(L)-1
return L[index] + sum(L[0:index])
L=[2,4]
print (sum(L))