簡體   English   中英

遞歸硬幣找零問題 - 計數排列

[英]recursive coin change problem - count permutations

給定一個硬幣列表和一個正整數 n>0,我需要找到總和為 n 的排列數。 列表中的每個硬幣都可以多次使用。 例如 - 給定以下列表:lst = [1,3,4] 和 n=4,函數應返回 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從內部調用傳遞獲勝者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM