列表产品的递归函数不起作用

时间:2015-11-26 16:28:57

标签: python list recursion

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

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

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

mult2(items)

4 个答案:

答案 0 :(得分:3)

这里有几个错误

  1. 你的基本情况是错误的。基础案例必须是当列表缩减为单个元素并且您需要返回1而不是0.
  2. 您需要发送一个包含单个元素的列表,而不仅仅是单个元素,以满足您的基本情况。
  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)

有两个问题:

  1. 单个元素传递给mult2,但序列是预期的。这就是为什么引发TypeError: 'int' object has no attribute '__getitem__'的原因,因为尝试下标int(正在执行的代码解析为1[1:],这根本不可能)。

  2. 您的退出条件已被破坏。中性乘数为1,而不是0.

  3. 修复后,您的代码将如下所示:

    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],这会转到使用mult21调用[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)