我正在尝试创建一个函数,它可以将列表中的每个项目相乘并返回总值。该函数不会在内存耗尽之前停止运行。 请有人解释一下为什么这不起作用呢?
items = [1,2,3,4,10]
def mult2(items):
if not items:
return 0
return mult2(items[0]) * mult2(items[1:])
mult2(items)
我正在尝试创建一个函数,它可以将列表中的每个项目相乘并返回总值。该函数不会在内存耗尽之前停止运行。 请有人解释一下为什么这不起作用呢?
items = [1,2,3,4,10]
def mult2(items):
if not items:
return 0
return mult2(items[0]) * mult2(items[1:])
mult2(items)
这里有几个错误:
更正后的代码:
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
将单个元素传递给 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)
[1,2,3]
调用mult2
,这将到达调用mult2
的返回语句,并使用1
和[1,2]
调用mult2
。1
调用mult2
,它只是一个整数。当到达递归部分时,因为此时items
只是一个整数,所以没有可用的索引,因此items[0]
和items[1:]
在此时没有意义。已经修复了原始帖子中的错误,以下代码可正常运行:
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)