ハノイの伝説の塔:ハノイ問題の塔は、古代インドの教育玩具に由来し、梵天を行うには、世界を作成したときに 3つのダイヤモンドの柱を、上のポストによるとボトムアップから 64金オーダーの大きさの山ディスク。ブラフマーブラフマンは、底部からディスクにコマンドを再度他の柱の上に配置されたサイズのために。所定の、ディスクが小さいディスクに拡大することができない、最初のディスクが3つの列の間で移動することができます。
数学的抽象化:左から右への上段A小さいが大きいn個のディスクを有するように積層しており、A、B、Cの3つの列があり、以下に示すように、今ポストCにA列にディスクを移動するために必要とされます唯一の原則の間:あなただけの大皿料理を移動していない小さな皿に上記のステップや動きの携帯電話の番号を見つけることができます。
再帰:再帰関数は、関数呼び出しそのものであり、大規模で複雑な問題は、私たちが解決するために再帰を使用することができ、問題の元小規模と同様の問題にCengcengことができる場合は、境界条件を持っている一般的な再帰的な必要性、再帰前端(部分問題)及び再帰リターン部(再帰出口)、境界条件が満たされない場合、順方向再帰;境界条件が満たされる場合、再帰リターン。
再帰関数の設計のヒント:
- 再発テーマ;
- 再帰関数のパラメータ。
- 再帰関数のエクスポート。
- 再帰の配列解析:小さな問題の大きな問題の分析、規模を縮小するために、各治療思考の使用を減らします。
種の問題を解決するための再帰的アルゴリズム:
- データが再帰的に定義に従って定義される;(フィボナッチ関数)
- この問題に対する解決策は、再帰アルゴリズムに従って達成される;(ハノイの塔)
- (:等DFS検索、マージソート、クイックソート、バイナリツリー、問題を示す、線状)、再帰的定義に従ったデータ構造の形で
ハノイ再帰的な分析の塔:
ディスク、ハノイの塔、再帰的な角度分析は、nがあると仮定します。
- Bのn-1個のA移動のプレート(補助カラムCによって)
- n番目のプレート、AからCへ移動します。
- (補助カラムAによって); Cへ移動板BによってN-1に
ゲーム方法:請求項におけるゲーム> A-からC動く;手動操作:まず、層の数を決定するN、層数が奇数の場合、最上位のA-> C、層の数が偶数である場合、最上層のA-> B。
ソリューションプログラム:
#include <iostreamの> 使用して 名前空間STD、 INT、M = 0 ; // 移動回数 空隙移動(INTディスク、チャー から、チャーへ){ COUT << " モバイル回:" <<(M ++)<< " ブロック:" << <<ディスク" としては、モバイル、次のとおりです。" << から << " - > " << <<へてendl; } // ハノイの再帰的なソリューションタワー のボイドハノイ(int型ディスク、CHAR チャーへチャーアシスト){ IF(==ディスク1。 )// 再帰出口; { 移動(ディスク、から)まで、; リターン; } // 再帰副問題、 ハノイ(disks- 1、から、アシスト、 )であり; // n番目のトレイ1、AからBへの移動、補助列Cによって; 移動(ディスク、からの、); // n番目のプレート、CにAから移動し、 ハノイ(disks- 1。、、に、アシストから); //は1 N-プレートを入れ、動きによってCにB、補助カラムAによって; } int型メイン(){ COUT << " ハノイのタワー:" << ENDL; int型 N- = 3 ; COUT << " ディスクのハノイ数のタワー:" << N - << ENDL; // 3つの列を作成します。 チャー A = 「A 」; 文字 B = 「B 」; チャー C = 「C 」; // ハノイの再帰溶液、動画出力ステップ; // n列目は、補助によりC列A、列Bからディスクへ移動させます、 ハノイ(N、A、C、B); // HANOR再帰溶液。 リターン 0 ; }
bash- 3.2 $ハノイC ++の.ccのタワー; ./a。OUT ハノイの塔: ディスクのHANOR番号: 携帯電話番号:1:ブロック配置する1 Mobileは次のように:A - > C bashの -を3.2 $ハノイC ++ .CCのタワー; ./a。OUT ハノイの塔: HANORディスク番号:2 の動きの数:1ブロックを配置する:1モバイル以下の通り:A - > B モバイル回:2ブロック:2次の移動に応じて:A - > C モバイル回:3。ブロック:1モバイル次のようにB - > C のbash - 3.2 $ハノイC ++ .CCのタワーズ; ./a。OUT HANOR質問: ハノイのディスク番号の塔:3 携帯電話番号:1ブロックに配置する:1モバイルは、以下のように:A - > C モバイル番号:2:ブロック配置する2次移動に応じて: - A> Bの :移動回数3:ブロック配置する1モバイル次のようにCを- > B モバイル回:4。ブロック配置する:3を移動次のように:A - > Cは 、移動時間:5。ブロック配置する:1を移動次のようにB - > シフト数:を6ブロックを配置する:2次の移動に応じて:B - - > C モバイル回:7。ブロック配置する:1以下の移動に伴って:A - > C
これは結果によって見出すことができる:移動の合計数は、2 ^ N-1倍; nはディスクの数です。
プログラムアドレス:ハノイの問題の.ccのhttps://github.com/yaowenxu/codes/blob/master/再帰/タワー
最新の状態に保た、ソースを明記してくださいは、詳細については、cnblogs.com/xuyaowen注意してください。
参考リンク:テキスト参照リンクから*図は、そのような不法行為などは、私が交換プライベートの手紙を喜ば。