我正在尝试创建一个函数,该函数将列表中的每个项目相乘并返回总计。在内存耗尽之前,该功能不会停止运行。 有人可以向我解释为什么这不起作用?
items = [1,2,3,4,10]
def mult2(items):
if not items:
return 0
return mult2(items[0]) * mult2(items[1:])
mult2(items)
答案 0 :(得分:3)
这里有几个错误
更正后的代码
def mult2(items):
if len(items)==1:
return items[0]
return mult2([items[0]]) * mult2(items[1:])
演示
>>> items = [1,2,3,4,10]
>>>
>>> def mult2(items):
... if len(items)==1:
... return items[0]
... return mult2([items[0]]) * mult2(items[1:])
...
>>> print(mult2(items))
240
答案 1 :(得分:2)
有两个问题:
单个元素传递给mult2
,但序列是预期的。这就是为什么引发TypeError: 'int' object has no attribute '__getitem__'
的原因,因为尝试下标int(正在执行的代码解析为1[1:]
,这根本不可能)。
您的退出条件已被破坏。中性乘数为1,而不是0.
修复后,您的代码将如下所示:
def mult2(seq):
if not seq:
return 1
return seq[0] * mult2(seq[1:])
items = [1,2,3,4,10]
assert 240 == mult2(items)
答案 2 :(得分:1)
您没有适合递归的基本案例。
考虑使用mult2
调用[1,2,3]
,这会转到使用mult2
和1
调用[1,2]
的return语句。
问题出在mult2
的调用中,参数1
只是一个整数。当你到达递归部分时,没有可用的索引,因为此时items
只是一个int,所以此时items[0]
和items[1:]
没有意义。
答案 3 :(得分:0)
修正了OP中的错误,这有效:
items = [1,2,3,4,10]
def mult2(items):
if len(items) == 1:
return items[0]
return items[0] * mult2(items[1:])
print "sum:",mult2(items)