列表乘积的递归函数不起作用

3

我正在尝试创建一个函数,它可以将列表中的每个项目相乘并返回总值。该函数不会在内存耗尽之前停止运行。 请有人解释一下为什么这不起作用呢?

items = [1,2,3,4,10]

def mult2(items):
    if not items:
        return 0
    return mult2(items[0]) * mult2(items[1:])

mult2(items)

3
不工作是指...?1. 错误 2. 错误输出 3. 异常。 - Bhargav Rao
1
抱歉,我已经编辑了我的问题。当我用列表调用函数并运行它时,程序永远不会结束,只有在内存耗尽时才会停止。好像它没有达到基本情况? - Chris
4个回答

3

这里有几个错误:

  1. 您的基本情况是错误的。基本情况必须是当列表减少到一个元素时,您需要返回1而不是0。
  2. 您需要发送一个仅包含单个元素的列表,而不是仅发送单个元素以满足您的基本情况。

更正后的代码:

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
好的,非常感谢!现在这样就清楚多了。 - Chris

2
有两个问题:
  1. 将单个元素传递给 mult2,但预期的是序列。这就是为什么会引发 TypeError:'int' object has no attribute '__getitem__',因为试图对 int 进行下标操作(执行的代码解析为 1[1:],这是不可能的)。

  2. 您的退出条件有问题。中性乘数为 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)

实现不需要对第一个项目进行递归调用的最佳答案 - R Nar

1
您的递归没有适当的基本情况。
考虑使用[1,2,3]调用mult2,这将到达调用mult2的返回语句,并使用1[1,2]调用mult2
问题在于使用参数1调用mult2,它只是一个整数。当到达递归部分时,因为此时items只是一个整数,所以没有可用的索引,因此items[0]items[1:]在此时没有意义。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接