2017-06-24 15 views
1

私はPythonでsudokuソルバーを開発しています。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 

これは、基本的に推測を行うアルゴリズムです。推測が間違っている場合、次の推測(whileループ)に進みます。

私が持っている問題は、可変パズル、スドクパズルです。推測が間違っている場合、whileループは次の候補に移動します。変数パズルには、ステップが誤って推測されたにもかかわらず、再帰のさらなるステップによって行われた変更が含まれるようになりました。私はこれを理解していない、他の変数は、それぞれの再帰スタックに固有のものであり、同じようにとどまるべきではない。

追加の説明を躊躇しないでください。

答えて

1

パズル変数はリストです。私の推測では、すべての機能バックトラックは、浅いコピーのために同じパズル(メモリ内の同じ場所)を使用しているということです。 ここでは、Pythonでの浅いコピーと深いコピーに関する素敵な答えです。 What exactly is the difference between shallow copy, deepcopy and normal assignment operation?

は、具体的には問題は難問=バックトラック(パズル) ライン であることができ、私はパズルのディープコピーを作成してみてくださいと再帰

+1

にそれを与えるだろう、ありがとうございます。 deepcopyはすべてを変更しました。 puzzler = backtrack(copy.deepcopy(puzzle))は解決策です、ありがとうございます。 –