【问题标题】:Recursive function of the product of a list not working列表乘积的递归函数不起作用
【发布时间】:2016-02-29 19:47:23
【问题描述】:

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

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

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

mult2(items)

【问题讨论】:

  • 不像...那样工作? 1. 错误 2. 错误输出 3. 异常
  • 抱歉,我已经编辑了我的问题。当我用列表调用函数并运行它时,程序永远不会结束,直到内存用完。好像它没有达到基本情况?

标签: python list recursion


【解决方案1】:

这里有几个错误

  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

【讨论】:

  • 好的,非常感谢!这现在更有意义了。
【解决方案2】:

您的递归没有正常工作的基本案例。

考虑用[1,2,3] 调用mult2,这将得到调用mult21[1,2] 的return 语句。

问题在于使用参数1 调用mult2,它只是一个整数。当您到达递归部分时,没有可用的索引,因为此时 items 只是一个 int,所以 items[0]items[1:] 在这一点上没有意义。

【讨论】:

    【解决方案3】:

    有两个问题:

    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)
    

    【讨论】:

    • 实现不需要递归调用第一项的最佳答案
    【解决方案4】:

    修复了 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 2018-04-02
      • 2014-04-03
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2012-12-05
      相关资源
      最近更新 更多