ハノイの塔再帰アルゴリズムを理解してください

1.ゲームによって引き起こされるハノイの問題

ハノイの塔は伝説に基づいた質問です。ハノイの塔(別名ハノイの塔)の号は、インドの古代の伝説に由来する教育玩具です。ブラフマーが世界を創造したとき、彼は3つのダイヤモンドの柱を作りました.1つの柱に、64個の金色の円盤が下から上にサイズ順に積み重ねられました。グレートブラフマーは、下からサイズの順にディスクを別の柱に再配置するようにバラモンに命じました。また、小さなディスクではディスクを拡大することはできず、一度に3本の柱の間を移動できるディスクは1つだけであると規定されています。

2.数学的問題

0000

ハノイ問題を数学の問題として抽象化します。まず、次の3つの柱A、B、Cを示します。その中には、A列に小さいものから大きいものへと上から下に積み上げられたN個のクラウドディスクがあります。ここで、AピラーのディスクをCピラーに移動する必要があります。ここで、各移動が満たされる必要があります。

  1. 一度に移動できるディスクは1つだけです
  2. 小さなディスクは拡大できません

次に、この数学的問題について、関連する質問をすることができます。

  1. 少なくともN枚のディスクを移動するには何回必要ですか
  2. ステップMでどのディスクが移動しているか、およびディスクが移動している方向
問題解決:

合計N枚のディスクがあるとすると、ステップは移動の総数を表します

1.質問1の場合

(1)N == 1の場合

第1次 1号盘 A—->C 
Steps = 1 次

(2)N == 2の場合

11号盘 A—->B22号盘 A—->C31号盘 B—->C 
Steps = 3

(3)N == 3の場合

11号盘 A—->C
​第22号盘 A—->B
​第31号盘 C—->B
​第43号盘 A—->C
​第51号盘 B—->A
​第62号盘 B—->C
​第71号盘 A—->C 
Steps = 7

一枚一枚押し下げると、ディスク数Nと総移動数にそのような法則があることがわかります。

1个圆盘的次数 21次方减1
2个圆盘的次数 22次方减1
3个圆盘的次数 23次方减1...
...
...
​n个圆盘的次数 2的n次方减1

したがって、方程式の関係を描くことができます。 St e p s =2n1 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

出力効果は次のとおりです。
0001

簡単そうに見えますか?当時はなぜ再帰なのかわからなかったのですが、実は先生の話を何度も聞いてみると、無知で理解しているふりをしていたような気がしました。理解できなかったとしても、やってみる必要があります。探索します。証明を渡すことは良い方法かもしれません。

この再帰的アルゴリズムを正当化するために数学中归纳法、理解するために使用することができます再帰的アルゴリズムの問​​題については、再帰的呼び出し全体を最初から追跡することを考えないでください。知乎には非常に鮮やかな描写がたくさんあります実際、ディスクが3つ未満のHanoi mobileの場合、実際には理解しやすいです。しかし、数が増えると、この問題について考えるのがより複雑になります。そのため、再帰全体を拡張するのではなく、レイヤー間の転送から理解する必要があります。

ここで、1つのディスクのみを移動する必要がある場合、この時点でN = 1は1回
だけ移動する必要があります。つまり、最初のディスクをAからCに移動します。

步骤  圆盘  柱子移动方向
1     1     A -> C

2つのプレートを移動する場合、N = 2

步骤  圆盘  柱子移动方向
1    1     A -> B2    2     A -> C3    1     B -> C

3枚のディスクを移動する場合、この時点でN = 3

步骤  圆盘  柱子移动方向
1     1     A -> C
2     2     A -> B3     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

これは、ハノイの再帰的アルゴリズムの誘導プロセスです。

データ参照:

  1. ハンルオタインタラクティブ百科事典
  2. 関数呼び出しスタック分析+図

おすすめ

転載: blog.csdn.net/qq_36148847/article/details/80783521