1.ゲームによって引き起こされるハノイの問題
ハノイの塔は伝説に基づいた質問です。ハノイの塔(別名ハノイの塔)の号は、インドの古代の伝説に由来する教育玩具です。ブラフマーが世界を創造したとき、彼は3つのダイヤモンドの柱を作りました.1つの柱に、64個の金色の円盤が下から上にサイズ順に積み重ねられました。グレートブラフマーは、下からサイズの順にディスクを別の柱に再配置するようにバラモンに命じました。また、小さなディスクではディスクを拡大することはできず、一度に3本の柱の間を移動できるディスクは1つだけであると規定されています。
2.数学的問題
ハノイ問題を数学の問題として抽象化します。まず、次の3つの柱A、B、Cを示します。その中には、A列に小さいものから大きいものへと上から下に積み上げられたN個のクラウドディスクがあります。ここで、AピラーのディスクをCピラーに移動する必要があります。ここで、各移動が満たされる必要があります。
- 一度に移動できるディスクは1つだけです
- 小さなディスクは拡大できません
次に、この数学的問題について、関連する質問をすることができます。
- 少なくともN枚のディスクを移動するには何回必要ですか
- ステップMでどのディスクが移動しているか、およびディスクが移動している方向
問題解決:
合計N枚のディスクがあるとすると、ステップは移動の総数を表します
1.質問1の場合
(1)N == 1の場合
第1次 1号盘 A—->C
Steps = 1 次
(2)N == 2の場合
第1次 1号盘 A—->B
第2次 2号盘 A—->C
第3次 1号盘 B—->C
Steps = 3 次
(3)N == 3の場合
第1次 1号盘 A—->C
第2次 2号盘 A—->B
第3次 1号盘 C—->B
第4次 3号盘 A—->C
第5次 1号盘 B—->A
第6次 2号盘 B—->C
第7次 1号盘 A—->C
Steps = 7 次
一枚一枚押し下げると、ディスク数Nと総移動数にそのような法則があることがわかります。
1个圆盘的次数 2的1次方减1
2个圆盘的次数 2的2次方减1
3个圆盘的次数 2的3次方减1
...
...
...
n个圆盘的次数 2的n次方减1
したがって、方程式の関係を描くことができます。 St e p s =2n− 1 S teps = 2 n − 1
2.質問2の場合
以前数学归纳法
は、ハノイの再帰的アルゴリズムを理解していました。再帰の場合、メソッドがそれ自体を内部的に呼び出すことを意味し、エンドポイントが必要です。アセンブリ言語を学習したパートナーは、各再帰呼び出しが実際にはスタック操作であり、この再帰呼び出しが実際にはメソッド呼び出しスタックのプロセスであることを知っておく必要があります。メソッドは、呼び出されるたびにメインスレッドから呼び出され、スタックは継続的にプッシュおよびポップされます。その中で、メソッドの転送はメソッドをスタックにプッシュすることであり、メソッドの最後はメソッドがスタック解除されるプロセスです。これにより、メソッド呼び出しのシーケンスフローが保証されます。つまり、関数に複数のレベルのネストがある場合、関数を外側から内側にスタックにプッシュする必要があり、スタックの最上位の関数が最初に実行されます(最も内側の関数が最初に実行されます)終了後)、スタックがポップされ、最後から2番目のレイヤーの関数実行が終了します。最後に、スタックへの最初の関数呼び出しがスタックからメインスレッドにポップされます。終了します。
スタックの特徴は次のとおりです。FIFO(先入れ先出し)。たとえば、メソッドはそれ自体を呼び出し、呼び出しプロセスの1つはスタッキングプロセスです:A-> A(1)-> A(2)-> A(3)
A(3)が特定の条件を満たすと、終了してA(2)に戻り、A(2)はA(1)に戻り、次にAに戻ることができます。スタックプロセス:A(3)-> A( 2)-> A(1)-> A
それでは、ハノイの再帰的問題を見てみましょう。最初に、現在のハノイの再帰的アルゴリズムの実装を見てみましょう。
### move_hanoi.py
def move(num,go,to):
global i
i=i+1
print('第{}步--移动 {} 号圆盘:'.format(i,num), 'move',go,'to',to)
def hanoi(num,a,b,c):
if num == 1:
move(num,a,c)
return
hanoi(num-1,a,c,b)
move(num,a,c)
hanoi(num-1,b,a,c)
hanoi_move(5,'A','B','C')
i=0
出力効果は次のとおりです。
簡単そうに見えますか?当時はなぜ再帰なのかわからなかったのですが、実は先生の話を何度も聞いてみると、無知で理解しているふりをしていたような気がしました。理解できなかったとしても、やってみる必要があります。探索します。証明を渡すことは良い方法かもしれません。
この再帰的アルゴリズムを正当化するために数学中归纳法
、理解するために使用することができます。再帰的アルゴリズムの問題については、再帰的呼び出し全体を最初から追跡することを考えないでください。知乎には非常に鮮やかな描写がたくさんあります。実際、ディスクが3つ未満のHanoi mobileの場合、実際には理解しやすいです。しかし、数が増えると、この問題について考えるのがより複雑になります。そのため、再帰全体を拡張するのではなく、レイヤー間の転送から理解する必要があります。
ここで、1つのディスクのみを移動する必要がある場合、この時点でN = 1は1回
だけ移動する必要があります。つまり、最初のディスクをAからCに移動します。
步骤 圆盘 柱子移动方向
1 1 A -> C
2つのプレートを移動する場合、N = 2
步骤 圆盘 柱子移动方向
1 1 A -> B
2 2 A -> C
3 1 B -> C
3枚のディスクを移動する場合、この時点でN = 3
步骤 圆盘 柱子移动方向
1 1 A -> C
2 2 A -> B
3 1 C -> B
4 3 A -> C
5 1 B -> A
6 2 B -> C
7 1 A -> C
上記の動きに従って、ディスクの動きの法則を要約します。
- 移動記録では、プレートの数とプレートの数が同じである場合、それらのステップはすべてAからCに移動しています。
- 他の手順は同等です
3番目のケースでは、手順1〜3と手順5〜7を確認してください。
ステップ1〜3:目標はAからBに移動することです。Bを終点と見なすと、ここでの手順1〜3は、2枚のディスクを移動する3つの手順とまったく同じです。
步骤 圆盘 柱子移动方向 B、C 互换 1 1 A -> C (A -> B) 2 2 A -> B (A -> C) 3 1 C -> B (B -> C) 即此时相当于 (XCHG B,C),将 B、C 进行了互换
ステップ5〜7:目標はBからCに移動することです。Cを終点とすると、ここでの5〜7の手順は、2枚のディスクを移動する3つの手順とまったく同じです。
步骤 圆盘 柱子移动方向 B、A 互换 5 1 B -> A (A -> B) 6 2 B -> C (A -> C) 7 1 A -> C (B -> C) 即此时相当于 (XCHG B,A),将 B、A 进行了互换
次に、上記で得られた法則を次のように要約できます。
- 1.ディスクは1つだけで、Steps = 1、AからCに移動して終了します
- 2. N個のディスクがある場合、Steps = 2 ^ n-1は奇数であり、中央のすべてのアクションはすべてAからCに移動します。
- 3.すべての中間アクションは次のように考えることができます:AからBに移動する
- 4.すべての中間アクションは次のように考えることができます:BからCに移動する
上記の法則を表現するために擬似コードを使用します
Function MOVE(N,A,B,C)
IF N ==1 THEN
Print A;"TO",C
ELSE
CALL MOVE(N-1,A,C,B);//MOVE(N,A,B,C)中 B、C 互换,N=N-1
Print A;"TO",C
CALL MOVE(N-1,B,A,C);//MOVE(N,A,B,C)中 B、A 互换,N=N-1
END IF
これは、ハノイの再帰的アルゴリズムの誘導プロセスです。
データ参照: