硬币找零问题的递归解

时间:2019-12-18 16:25:34

标签: python-3.x recursion coin-change

我需要编写一种算法,该算法接收一个数字和一个数字列表,并从列表中返回可以创建总和的数字可能组合的数量。例如:def coin(5,[1,2,5,6]应该返回数字4,因为列表中有4种可能的组合可以一起创建数字5。下面是我尝试过的代码,但它确实不起作用。输出是6而不是4,我很想帮助您理解为什么。谢谢advande。

def coin(n,lst):
    if n<=1:
        return 1
    else:
        total=0
        for i in range(len(lst)):
            change=lst[i]
            if change>n:
                continue
            else:
                result=coin(n-change,lst[i:])
                if result>0:
                    total+=result
        return total
print(coin(5,[1,2,5,6]))

2 个答案:

答案 0 :(得分:0)

错误是在基本情况下

    if n<=1:
        return 1

仅当1是允许的硬币之一时才有效。但是在递归的情况下,您将列表切成lst[i:],因此并非每次都不允许所有硬币。有时,1不是允许的硬币之一,在这种情况下,共有零种方法可以使总数达到1,而不是一种方法。要解决此问题,请编写类似以下内容的

    if n <= 1:
        if n == 0 or n in lst:
            return 1
        else:
            return 0

这是正确的,因为您可以在基本情况下更改n,如果n为0(我们总是可以为0),或者n为1并且1为允许的硬币之一。

也就是说,让递归案例处理1更简单,因此基本案例只需要处理0;这也是正确的:

    if n == 0:
        return 1

答案 1 :(得分:-1)

const mycustomStruct* pFlmcCtrl = static_cast<const mycustomStruct*>(pMdbCluster);