ハノイの塔(Hanoi Towers)は、再帰的アルゴリズムの学習に役立つクラシックな問題です。このパズルでは、3つの柱(A、B、C)と、異なるサイズの円盤が与えられます。最初にすべての円盤が柱Aに積まれており、目的は次のルールに従ってすべての円盤を柱Cに移動させることです。
- 一度に移動できるのは1枚の円盤だけ。
- 円盤は大きいものが小さいものの上に積まれている状態にはできない。
- 1つの円盤は1つの柱から別の柱に移動する。
この問題を解くためには、再帰的なアプローチが非常に有効です。再帰の基本的なアイデアは、問題を小さな部分に分割して解くことです。
ハノイの塔を解くアルゴリズムの説明
-
基本ケース:
円盤が1枚だけの場合、それを直接目的の柱に移動します。 -
再帰ケース:
まず、上からn-1枚の円盤を補助の柱に移動し、その後、n番目の円盤を目的の柱に移動します。最後に、補助の柱から残りの円盤を目的の柱に移動します。
アルゴリズムをPythonで実装
以下にPythonを使ったハノイの塔の解法を示します。関数 hanoi は再帰的に円盤を移動させ、各移動を表示します。
pythondef hanoi(n, source, target, auxiliary):
# 基本ケース:円盤が1枚の場合
if n == 1:
print(f"円盤1を{source}から{target}に移動")
return
# 再帰ケース:n-1枚の円盤を補助の柱に移動
hanoi(n-1, source, auxiliary, target)
# n番目の円盤を目的の柱に移動
print(f"円盤{n}を{source}から{target}に移動")
# 補助の柱から目的の柱に残りの円盤を移動
hanoi(n-1, auxiliary, target, source)
# 円盤の数
n = 3 # 例えば、3枚の円盤
# 初期設定:柱Aから柱Cに円盤を移動(柱Bは補助)
hanoi(n, 'A', 'C', 'B')
実行結果
上記のコードを実行すると、以下のような出力が得られます。これは、3枚の円盤を柱Aから柱Cに移動するための手順を示しています。
css円盤1をAからCに移動
円盤2をAからBに移動
円盤1をCからBに移動
円盤3をAからCに移動
円盤1をBからAに移動
円盤2をBからCに移動
円盤1をAからCに移動
解法の説明
- 最初に、円盤1を柱Aから柱Cに移動します。
- 次に、円盤2を柱Aから柱Bに移動します。
- 円盤1を柱Cから柱Bに移動します。
- 円盤3を柱Aから柱Cに移動します。
- 円盤1を柱Bから柱Aに移動します。
- 円盤2を柱Bから柱Cに移動します。
- 最後に、円盤1を柱Aから柱Cに移動します。
このようにして、すべての円盤が目的の柱Cに移動されます。
時間計算量と再帰の深さ
ハノイの塔問題の解法では、再帰的にn回の操作を行うごとに、n-1回の操作を再度行うため、時間計算量は O(2^n) です。つまり、円盤の枚数が増えると、必要な移動回数は指数関数的に増加します。
再帰の深さは、最長でもn回の再帰呼び出しが行われるため、再帰の深さは O(n) となります。
結論
ハノイの塔は、再帰的アプローチを理解しやすくするための良い問題です。Pythonでの実装は簡単で、再帰の基本を学ぶために非常に役立ちます。このアルゴリズムは、再帰がどのように機能するかを理解する上で重要な役割を果たします。また、解くために必要な時間は指数関数的に増加するため、大きなnには適していませんが、再帰的問題の理解を深めるためには最適な教材となるでしょう。
