递归硬币找零问题 - 计算排列

recursive coin change problem - count permutations

给定一个硬币列表和一个正整数 n>0,我需要找到总和为 n 的排列数。列表中的每个硬币都可以使用多次。例如 - 给定以下列表:lst = [1,3,4] 和 n=4,函数应该 return 4: for : [1,1,1,1], [1,3], [3,1] 和 [4]。 我被要求给出一个递归的解决方案。 我知道如何编写计算组合数的递归代码,但我不知道如何编写计算排列数的代码。

这是我的代码:

def coin_change(lst, n):
if n == 0:
    return 1
if len(lst) == 0:
    return 0
if n<0:
    return 0

return coin_change(lst, n-lst[0]) + coin_change(lst[1:], n)

谢谢

你有一些问题。您一直在尝试减少列表,但是因为允许重复,所以您不能这样做。你必须每次都尝试整个列表,直到总和超过计数。这可以满足您的要求:

track = []
def coin_change(lst, n, sofar=[]):
    if sum(sofar) == n:
        print("winner", sofar)
        track.append( sofar )
        return
    if sum(sofar) > n:
        return
    for i in lst:
        coin_change( lst, n, sofar+[i] )
    return track

print(coin_change([1,3,4], 4))

输出:

winner [1, 1, 1, 1]
winner [1, 3]
winner [3, 1]
winner [4]
[[1, 1, 1, 1], [1, 3], [3, 1], [4]]

另一种方法是使用 yield 生成赢家,并使用 yield from 从内部调用传递赢家。