2010-04-03 5 views
2

Je n'arrive pas à récupérer ma liste dans mon code. Au lieu de retourner la liste, il continue de retourner None, mais si je remplace le retour par print dans l'instruction elif, il imprime la liste très bien. Comment puis-je réparer cela?Retour d'une liste dans cette fonction coi récursive en python

def makeChange2(amount, coinDenomination, listofcoins = None): 
#makes a list of coins from an amount given by using a greedy algorithm 
    coinDenomination.sort() 
    #reverse the list to make the largest position 0 at all times 
    coinDenomination.reverse() 
    #assigns list 
    if listofcoins is None: 
     listofcoins = [] 
    if amount >= coinDenomination[0]: 
     listofcoins = listofcoins + [coinDenomination[0]] 
     makeChange2((amount - coinDenomination[0]), coinDenomination, listofcoins) 
    elif amount == 0: 
     return listofcoins 
    else: 

     makeChange2(amount, coinDenomination[1:], listofcoins) 
+0

Nate, Mark Rushakoff a répondu à votre question. vous devriez accepter sa réponse. Vous pouvez le faire en cliquant sur la coche (✓) sous le décompte des votes de la réponse. – tzot

Répondre

3

Vous n'êtes pas return la valeur des ing les appels récursifs à makeChange2.

Une fois que le contrôle atteint l'un de ces appels à makeChange2 et termine l'appel, le programme passe à l'instruction suivante, qui est la fin de la fonction; ainsi, il renvoie None.

Si ce concept est toujours vous donner du mal, essayez d'exécuter ce programme simple factoriel avec et sans le mot-clé return dans la ligne return n*factorial(n-1):

def factorial(n): 
    if n == 0 or n == 1: 
     return 1 
    return n * factorial(n-1) 

print factorial(3) 

marche manuellement à travers le code devrait aider à élucider ce qui était erroné dans votre programme original.

+0

Je ne comprends pas encore. Comment revient-il à la fin de la fonction si le montant passe toujours à 0? Il ne devrait pas atteindre la fin de la fonction. Aussi, j'ai traversé cette chose sanglante pendant 10 heures. Croyez-moi, je ne demande que des endroits comme celui-ci en dernier recours. Je suis perplexe, et je ne sais tout simplement pas quoi faire. En outre, le retour en ajoutant ne fonctionne pas: retour makeChange2 ((montant - coinDenomination [0]), coinDenomination, listofcoins) quantité Elif == 0: listofcoins retour – Nate

+0

Nevermind je vois ce que vous dites maintenant. Je dois retourner dans les deux if et else déclarations, ou il va à la fin de la liste dans tous les appels sauf le dernier. Merci de votre aide. – Nate