递归地对列表的元素求和
Posted
技术标签:
【中文标题】递归地对列表的元素求和【英文标题】:Summing the elements of a list recursively 【发布时间】:2018-12-02 20:29:44 【问题描述】: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()。
【问题讨论】:
预期结果是什么? 预期结果是此示例中列表元素的总和,它必须是 6 您不能接受多个答案。您是否阅读了所有答案以确定对您最有帮助的答案? 【参考方案1】:在sum (len (L) // 2)
中,您将一个整数(len(L) // 2
的结果)作为L
参数传递给sum()
函数。 (请不要给函数赋予与内置函数相同的名称。)递归调用的sum()
然后尝试在这个整数上评估len(L) == 1
,但整数不支持len()
,所以你得到有问题的错误信息。你到底想做什么?
【讨论】:
【参考方案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
【讨论】:
谢谢!下次我会尝试更清楚。现在可以了【参考方案3】:-
不要将函数命名为
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]
...
【讨论】:
【参考方案4】:在你的代码中
i = 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))
【讨论】:
以上是关于递归地对列表的元素求和的主要内容,如果未能解决你的问题,请参考以下文章