Un énorme problème est dans le code ci-dessous: vous déduisez la quantité d'étapes pour chaque possibilité dans la plage d'étapes.
n=n-i
res=CSR(n,i,res)
Lorsque vous avez terminé d'explorer ce que vous pouvez faire avec un saut 1 étape, vous devez backtrack et essayez de la même point de départ (valeur d'origine de n
de cette instance) avec un 2 saut d'étape. Modifiez le code à:
res = CSR(n-i, i, res)
Cela permet de maintenir intact valeur n
que vous passez par la boucle.
En outre, vous ne pouvez pas limiter les futurs sauts au maximum de ce que vous venez de prendre. Changer ce deuxième paramètre, aussi:
res = CSR(n-i, k, res)
Cela devrait vous aider à bouger. Essayez également ce joli blog debug pour obtenir de l'aide. Au moins insérer une ou deux instructions de suivi, telles que
print n, k, res
en haut de votre routine.
CAVEAT
Ce n'est pas tous vos problèmes. Le plus gros problème restant est que CSR
renvoie une seule solution: chaque étape que vous prenez est ajoutée à la liste . Vous avez besoin d'un moyen de rassembler les solutions complétées sous forme de listes séparées; le append
en climbingStaircase
est exécuté une seule fois, après CSR
est entièrement terminé.
Vous devez reconnaître une solution terminée à n==0
.
DEBUGGING AIDE
Voici une version de votre programme avec les paramètres de récursion fixes, et des traces de débogage insérés.
indent = ""
def climbingStaircase(n, k):
final_res = []
final_res.append(CSR(n, k, []))
return final_res
def CSR(n, k, res):
global indent
indent += " "
print indent, n, k, res
if n == 0:
print "SOLUTION", res
else:
for i in range(1, k+1):
if n-i >= 0:
CSR(n-i, k, res + [i])
indent = indent[:-2]
print climbingStaircase(4, 2)
Notez l'utilisation de "indent" pour aider à visualiser votre récursion et retour arrière.La partie critique ici est que, au lieu de mettre à jour res
globalement, je l'ai laissé comme une variable locale. J'ai également retiré la valeur de retour pour l'instant, tout simplement dumping pour sortir les solutions comme ils sont trouvés. Vous pouvez voir comment cela fonctionne:
4 2 []
3 2 [1]
2 2 [1, 1]
1 2 [1, 1, 1]
0 2 [1, 1, 1, 1]
SOLUTION [1, 1, 1, 1]
0 2 [1, 1, 2]
SOLUTION [1, 1, 2]
1 2 [1, 2]
0 2 [1, 2, 1]
SOLUTION [1, 2, 1]
2 2 [2]
1 2 [2, 1]
0 2 [2, 1, 1]
SOLUTION [2, 1, 1]
0 2 [2, 2]
SOLUTION [2, 2]
[None]
Avec ce genre de choses en place, je suis plein d'espoir que vous pouvez suivre votre logique et comprendre comment capturer la séquence de solutions à un niveau de votre choix.
Salut @Prune merci pour votre réponse rapide! n'est pas "if n == 0: return res" dans CSR reconnaissant une solution complète? Oui, je reçois une grande liste, pas la liste de la liste. J'ai essayé de faire apparaître les derniers éléments que j'ai ajoutés mais aucun succès pour le moment. – Aaron
Cela reconnaît une solution, mais ensuite vous la manipulez mal. Vous le retransmettez au niveau d'instance précédent, vous le sauvegardez sur lui-même, puis vous passez à la taille de saut suivante dans la plage autorisée, sans enregistrer la solution terminée dans la liste principale. Vous devez repenser votre logique dans cette branche du problème: ajoutez la solution terminée et réinitialisez la solution partielle au niveau de l'étape précédente. – Prune
Merci beaucoup pour votre temps. C'est probablement la réponse la plus utile + attentionnée que j'ai reçue dans SO. – Aaron