递归汇总列表的元素

时间:2018-06-23 17:36:50

标签: python algorithm recursion divide-and-conquer

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()。

4 个答案:

答案 0 :(得分:3)

sum (len (L) // 2)中,您将一个整数(len(L) // 2的结果)作为L参数传递给sum()函数。 (请不要给函数提供与内置函数相同的名称。)然后递归调用sum()尝试对此整数求值len(L) == 1,但整数不支持len() ,这样您就会得到有关错误消息的信息。您实际上到底想做什么?

答案 1 :(得分: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]
    ...

答案 2 :(得分:2)

我认为您的目标是编写一个递归sum函数,该函数将列表连续拆分为较小的块。因此,基本上,您需要做的是计算中点的索引,然后使用列表切片将第一个子列表和第二个子列表递归地传递到函数中,直到遇到0或{{剩余1}}个元素。

1

答案 3 :(得分:0)

在您的代码中

  

i =总和(len(L)// 2)

line抛出错误,因为在第一次调用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))