ハノイの塔
ハノイの塔についてはググって頂くとして。
ハノイの塔 wikipedia
棒1に刺さっている円盤の一番上のものを、棒2へと移動するとき
のように表現する
(1.2)
たとえば、棒 1に刺さっている3枚の円盤を、棒2へと移動することを考えたとき
その手順は以下のようになる
[ (1.2) (1.3) (2.3) (1.2) (3.1) (3.2) (1.2) ]
これを解く関数をPrologっぽい擬似言語で。帰納的に書いてみると、
一枚だけのときはそのまま素直に
ハノイの塔(1,開始位置,移動先,その他の棒,手順) :-
[(開始位置 . 移動先) ].
開始位置に円盤がN枚有る場合は、
- N−1枚を開始位置でも移動先でもない「その他の棒」へと移動
- N枚目=一番大きな円盤を 開始位置から移動先へ移動
- N−1枚の山をその上に移動
ハノイの塔(円盤の枚数,開始位置,移動先,その他の棒,手順) :-
ハノイの塔(円盤の枚数-1,開始位置,その他の棒,移動先,手順1),
ハノイの塔(円盤の枚数-1,その他の棒,移動先,開始位置,手順2),
リストを連結([手順1,[ (開始位置 . 移動先) ],手順2], 手順).
とりあえず擬似言語でしか書いてないので、ちゃんと動くかどうかチェックしてないですけれども。