[英]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.