タワー・オブ・ハノイ:理解と効果的な解決方法


  1. 1回の移動で1つの円盤のみを移動できます。
  2. より大きな円盤は、より小さな円盤の上に積むことはできません。

このパズルを効果的に解決するためには、再帰的なアルゴリズムを使用する方法が一般的です。以下に、いくつかの方法とコード例を示します。

方法1: 再帰関数を使用した解法

def tower_of_hanoi(n, source, target, auxiliary):
    if n > 0:
        # n-1個の円盤をソースから補助へ移動します
        tower_of_hanoi(n-1, source, auxiliary, target)

        # 最大の円盤をソースからターゲットへ移動します
        print("Move disk", n, "from", source, "to", target)

        # n-1個の円盤を補助からターゲットへ移動します
        tower_of_hanoi(n-1, auxiliary, target, source)
# パズルの解法を呼び出します
tower_of_hanoi(3, 'A', 'C', 'B')

このコードでは、再帰関数tower_of_hanoiを定義しています。関数は4つの引数を取ります: 円盤の数n、ソースの棒source、ターゲットの棒target、補助の棒auxiliary。再帰的なアプローチを使用して、円盤を移動するための適切な手順を定義しています。

方法2: スタックを使用した解法

def tower_of_hanoi(n, source, target, auxiliary):
    stack = [(n, source, target, auxiliary)]

    while stack:
        n, source, target, auxiliary = stack.pop()

        if n == 1:
            print("Move disk 1 from", source, "to", target)
        else:
            stack.append((n-1, auxiliary, target, source))
            stack.append((1, source, target, auxiliary))
            stack.append((n-1, source, auxiliary, target))
# パズルの解法を呼び出します
tower_of_hanoi(3, 'A', 'C', 'B')

このコードでは、スタックを使用して非再帰的なアプローチを実装しています。スタックにタプル(n, source, target, auxiliary)を追加し、スタックが空になるまでポップして処理を繰り返します。

以上がタワー・オブ・ハノイの理解と効果的な解決方法の例です。このパズルは一般的にコンピュータ科学の教育やパズル愛好家によって使用されます。再帰やスタックの理解を深めるためにも、ぜひ実際にコードを試してみてください。