[Python] ハノイの塔

ハノイの塔

ハノイの塔(ハノイのとう、Tower of Hanoi)はパズルの一種。 バラモンの塔または ルーカスタワー(Lucas’ Tower)[1]とも呼ばれる。

ハノイの塔
出典: フリー百科事典『ウィキペディア(Wikipedia)』

再帰で良く出てくるアレです。

説明を読むと納得はできるのですが、いまだに直感的に良く理解することができません。

多分自分には才能がないのだと思います。

Pythonで実装してみました。

コード

# 入力
N = int(input())

# 三本の杭を作る
start = list(range(N, 0, -1))
tmp = []
end = []


def print_piles():
    print('----')
    print('s: ', start)
    print('t: ', tmp)
    print('e: ', end)

def hanoi(n, start, end, tmp):
    if n <= 0:
        return
    # n-1 まで全てをstartからtmpに移動。
    hanoi(n-1, start, tmp, end)
    # n をstartからendに移動。
    end.append(start.pop())
    print_piles()
    # n-1 をtmpからendに移動。
    hanoi(n-1, tmp, end, start)

print_piles()
hanoi(N, start, end, tmp)

参考サイト

再帰の定番 ハノイの塔


ただし、棒a、bを0、1とすれば棒の総和 – (棒a + 棒b)で棒cを求めることができるので、
引数にわざわざ作業用の棒を渡さずにすっきり書けます。

サンプルコード:ハノイの塔