2017-06-24 5 views
1

Je développe un solveur de sudoku en Python.Comprendre la récursivité et les piles en Python

def backtrack(puzzle): 
    x,y,candidates=findSquare(puzzle) 
    if x==-1 and y==-1: 
     return puzzle #stop condition 
    while len(candidates[x][y])>0: 
     puzzle[x][y]=candidates[x][y].pop() 
     puzzler=backtrack(puzzle) 
     if isValid(puzzler): 
      return puzzler 
    return False 

C'est un algorithme qui fait essentiellement des suppositions. Quand une estimation est fausse, elle passe à la proposition suivante (la boucle while).

Le problème que j'ai est le puzzle variable, le puzzle de sudoku. Quand une supposition est fausse, la boucle while va aux prochains candidats. Le puzzle variable inclut maintenant les modifications apportées par les étapes supplémentaires de la récursivité, même si les étapes étaient fausses. Je ne comprends pas cela, les autres variables sont uniques à chaque pile de récursivité, ne devrait pas rester le même.

N'hésitez pas à demander des explications supplémentaires.

Répondre

1

La variable de puzzle est une liste. Ma conjecture est que chaque fonction backtrack utilise le même puzzle (le même endroit dans la mémoire) en raison de la copie superficielle. Voici une bonne réponse à propos de la copie peu profonde ou profonde en Python. What exactly is the difference between shallow copy, deepcopy and normal assignment operation?

Plus précisément, le problème pourrait être à la ligne = backtrack puzzler (casse-tête) Je voudrais essayer de créer une copie en profondeur de puzzle et de donner que la récursion

+1

Merci, monsieur. deepcopy a tout changé. puzzler = backtrack (copy.deepcopy (puzzle)) est la solution, merci. –