Рекурсивное суммирование элементов списка

1
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().

Теги:
algorithm
recursion
divide-and-conquer

4 ответа

2
Лучший ответ

Я думаю, что вы пытались написать рекурсивную функцию 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
  • 0
    Спасибо! я постараюсь быть более ясным в следующий раз. Теперь работает
3

В sum (len (L)//2) вы передаете целое число (результат len(L)//2) как аргумент L вашей функции sum(). (Пожалуйста, не предоставляйте функции с тем же именем, что и встроенные функции.) Рекурсивно называемая sum() затем пытается оценить len(L) == 1 на этом целое число, но целые числа не поддерживают len() и поэтому вы получите соответствующее сообщение об ошибке. Что именно вы на самом деле пытаетесь сделать?

2
  1. Не называйте sum своей функции, она затеняет встроенную функцию
  2. Реализуйте свою функцию, чтобы четко определить базовый регистр и рекурсивный случай.

    Для базового случая, когда длина равна 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]
    ...
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))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню