現在書かれている方法では、基本的に終了することはないように見えますし、実際には終了するべきではありません。
この問題について考え始める簡単な方法は、魔方陣は size のリストで表すことができるn**2
ため、3x3 の魔方陣は長さ 9 のリストで表すことができるということです。これは魔方陣であるため、値を並べ替える必要がありますrange(1,n+1)
。たとえば、3x3 の場合:
1 2 3
4 5 6
7 8 9
これが魔方陣であるかどうかを確認し (行の合計が同じ値にならないため、そうではありません)、魔方陣リストに追加します。いずれにせよ、次の順列を試してください。
1 2 3
4 5 6
7 9 8
…順列がなくなるまで。これはもちろん、問題のある行 (1、2、3) の合計が 15 にならないため、最適化されていないルートです。そのため、最適化の明確な余地があり、うまくいかない可能性を簡単に破棄できます。
あなたの仕事をチェックしたり、あなたのために順列部分をしたりするための簡単なツールはitertools.permutations
. これにより、順列がなくなるまで追加の順列を生成するジェネレーターが作成されます。
このメソッドを使用して毎回別の再帰呼び出しを行おうとすると、自明な正方形サイズを超えるものについては、再帰の最大制限を超えることに注意してください。一度その状況を管理する方法を見つける必要がありますsize=3
。正確に何をしようとしているかに応じて、さまざまな程度の複雑さを処理する方法がいくつかあります。