Le problème est le plus populaire pour illustrer la programmation dynamique, qui est la suivante. Nous avons des pièces de monnaie illimitées de chacune des dénominations 1, 3 et 5. Nous voulons que le nombre minimum de pièces pour obtenir le montant N.Nombre minimum de pièces pour constituer un montant en utilisant la récursivité
Je suis conscient de la méthode de programmation dynamique où nous construisons une solution à partir de la base cas (s). Mais je voulais voir comment écrire une solution purement récursive. Je suis capable de travailler facilement à la main pour N = 11 et dénominations = [1,3,5]. Mais pour une raison quelconque, je suis incapable de faire le travail suivant.
def minNumberOfCoins(amount, denominations):
if amount <= 0:
return(0)
if amount in denominations:
return(1)
else:
listToExamine = list(filter(lambda x: x > 0, map(lambda x: amount - x, denominations)))
print(listToExamine)
minVal = min(listToExamine, key=lambda x: 1 + minNumberOfCoins(x, denominations))
return(minVal)
Pour autant que je sache, la logique est identique à ce que j'ai élaboré sur papier. Y a-t-il une nuance dans la récursivité de Python que je ne connais pas, ou y a-t-il quelque chose de subtil qui me manque? Je vous remercie!
Bien que cela ne soit pas pertinent pour votre question, Python idiomatique utilise 'snake_case' par opposition à' camelCase'. – Hindol
Notez que votre solution ne fonctionne pas: 'minNumberOfCoins (10, [1, 5, 6])' renvoie 5 au lieu de 2. Elle soulève également une exception sur 'minNumberOfCoins (1, [2])'. – bfontaine
bfontaine, oui, bien sûr, j'ai remarqué que ça ne marchait pas parce que je l'ai d'abord travaillé sur papier. Je me demandais ce que j'ai manqué en écrivant le code. Je vais passer par John Gordon pour comprendre ce que j'ai manqué. – user4562262