- 1回の移動で1つの円盤のみを移動できます。
- より大きな円盤は、より小さな円盤の上に積むことはできません。
このパズルを効果的に解決するためには、再帰的なアルゴリズムを使用する方法が一般的です。以下に、いくつかの方法とコード例を示します。
方法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)
を追加し、スタックが空になるまでポップして処理を繰り返します。
以上がタワー・オブ・ハノイの理解と効果的な解決方法の例です。このパズルは一般的にコンピュータ科学の教育やパズル愛好家によって使用されます。再帰やスタックの理解を深めるためにも、ぜひ実際にコードを試してみてください。