【问题标题】:TypeError: 'NoneType' object is not iterable in Python recursionTypeError:“NoneType”对象在 Python 递归中不可迭代
【发布时间】:2021-12-16 12:34:10
【问题描述】:

问题说:

给定一个整数数组coins,表示不同面额的硬币,>一个整数表示总金额。 返回您需要的最少数量的硬币来弥补该金额。如果该金额不能由任何硬币组合组成,则返回-1。'

这是我正在尝试的:

def coinChange(coins, amount, final_list=[]):
    """
    :type coins: List[int]
    :type amount: int
    :rtype: int
    """

    if all(coins) > amount:
        return -1
    while amount > 0:
        if amount - max(coins) >= 0:
            amount -= max(coins)
            final_list.append(max(coins))
        else:
            return coinChange(coins.remove(max(coins)), amount, final_list)

    return len(final_list)
coins = [1,2,5]
amount = 11
coinChange(coins, amount)
    
    

有人可以帮忙吗

【问题讨论】:

  • if all(coins) > amount 不正确。 all() 返回 TrueFalse,将其与 amount 进行比较是没有意义的。
  • 你不应该使用可变类型作为默认参数。 final_list=[] 不会做你想做的事;执行final_list = None 之类的操作并在体内执行if final_list is None: final_list = []
  • 请发布完整的回溯,以便我们轻松查看错误。请注意,def coinChange(coins, amount, final_list=[]): 创建一个空列表作为final_list 的默认值,并且该列表始终用作默认值。所有使用默认值对coinChange 的调用都将附加到该列表中。
  • coins.remove(max(coins)) 修改coins 列表并返回None。这就是错误的原因。
  • 不要羞于添加打印语句,显示您在执行过程中计算的值。这是遵循执行流程的好方法。此外,许多 IDE 都有调试器,它们对此非常有用。或者去老学校,使用 python 的pdb 行调试器。

标签: python recursion dynamic-programming


【解决方案1】:

cmets 中提到了很多问题,其他的我就不去尝试解决了。

您收到特定错误的原因是remove() 修改了列表,它不返回修改后的列表。因此,当您进行递归调用时,您将 None 作为 coins 参数传递。

所以将remove()与函数调用分开调用。

    else:
        coins.remove(max(coins))
        return coinChange(coins, amount, final_list)

【讨论】:

  • 这有帮助!这对我来说是一个愚蠢的错误。非常感谢!
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2015-12-24
  • 2012-08-25
相关资源
最近更新 更多