0

魔方陣を解くための再帰順列関数を書くのに少し苦労しています。この関数では、2 次元配列は使用できず、リストのみを使用できます。以下は私が現在持っているものです:

def permute(size):
    magicSquare = []
    for value in permute(size**2):
        for pos in range(size**2 + 1):
            magicSquare.append(value)
    return magicSquare

sizeコマンドライン引数を使用してユーザーが定義します。

上記の関数が値を並べ替えるというタスクを達成するかどうか、私は少し混乱しています。

4

2 に答える 2

5

現在書かれている方法では、基本的に終了することはないように見えますし、実際には終了するべきではありません。

この問題について考え始める簡単な方法は、魔方陣は 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。正確に何をしようとしているかに応じて、さまざまな程度の複雑さを処理する方法がいくつかあります。

于 2011-12-12T05:03:53.590 に答える