日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 漢諾塔遞歸算法理解及實現

漢諾塔遞歸算法理解及實現

來源:程序員人生   發布時間:2015-06-04 08:22:17 閱讀次數:5156次

漢諾塔:(Hanoi)是1種玩具,如圖:
這里寫圖片描述
從左到右 A B C 柱 大盤子在下, 小盤子在上, 借助B柱將所有盤子從A柱移動到C柱, 期間只有1個原則: 大盤子只能在小盤子的下面.
問題理解與描寫:
1.問題的理解與描寫
問題的情勢化表示為:
輸入:圓盤數n,3根細桿―― 源桿A、過渡桿B和目標桿C。
輸出:圓盤從源桿移動到目標桿進程的最少步驟序列。
2.算法的偽代碼:

HANOI(n, A, B, C) 1 if n=1 2 then print A,"?", C 3 return 4 HANOI(n-1,A, C, B) 5 print A,"?", C 6 HANOI(n-1,B, A, C)

3.算法的運行時間:
對盤數n,HANOI進程的運行時間
這里寫圖片描述

4 算法理解:
理解1:(參考:http://blog.csdn.net/yafei450225664/article/details/8647908)

案例 1 - 假定只有1個盤子的時候, 盤子數量 N=1
只有1個步驟 將第1個盤子從A移動到C, 為了對照方便我這樣來描寫這個步驟:
步驟 盤子編號 從柱子移動 移動到柱子
1 1 A C
案例 2 - 如果有兩個盤子, 盤子數量 N = 2
步驟 盤子編號 從柱子移動 移動到柱子
1 1 A B
2 2 A C
3 1 B C
案例 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
如何找出盤子移動的規律 ?
我們要做的最重要的1件事情就是永久要把最底下的1個盤子從 A 移動到 C
看看上面從1個盤子的移動到3個盤子的移動, 在移動記錄中,當盤子的編號和盤子數量相同的時候他們的步驟都是從A移動到C (看加粗的部份),其它的步驟對等.
再視察第3個案例中的第 1⑶ 步 和 第 5⑺步
第 1⑶ 步 目的是從 A 移動到 B 如果我們把 B 當作終點, 那末這里的第 1⑶ 步理解起來和 第2個案例的3個步驟完全相同, 都是通過1個柱子來移動,和第2個案例比起來在后面加括號來表示
1 1    A C ( A -> B)
2 2    A  B ( A -> C)
3 1 C B ( B -> C)
總結:將盤子B變成C便可.
第 5⑺ 步 目的是從 B 移動到 C 如果我們把 C 當作終點, 那末這里的 5⑺ 步理解起來和上面也是1樣的, 和第2個案例的3個步驟也完全相同.和第2個案例比起來就是:
5 1 B A ( A -> B)
6 2 B C ( A- > C)
7 1 A C ( B -> C)
總結: 將盤子B變成A便可
根據這個演示可以明確幾點規律:
1. 當盤子只有1個的時候,只有1個動作 從 A 移動到 C 即結束.
2. 當有N個盤子的時候, 中間的動作都是從 A 移動到 C, 那末表示最下面的第N個盤子移動終了
3. 中間動作之上都可以認為是: 從 A 移動到 B
4. 中間動作之下都可以認為是: 從 B 移動到 C
2,3,4 可以表示為
1 1 A B
2 2 A C
3 1 B C
理解2:(參考:http://blog.csdn.net/leo115/article/details/7991734)
美國的1位學者發現1種出人意料的簡單的算法,只要輪番兩步操作既可以實現:首先,把3張桌子按順序首尾相接的排列,構成1個環,然后對A上的盤子開始移動,順時針擺放成 A B C的順序:
若n為奇數,圓盤的移動順序是 A->C->B->A->C->B->A……… 即 間隔兩個步長移動 。此處的n代表盤子位的層數,比如說 3 層漢諾塔就是從下往上數第1、3 個盤子移動的順序。
若n為偶數,圓盤移動的順序為A->B->C->A->B->C->A……….即 間隔1個步長移動。對n的解釋同上 第2個盤子移動 A->B->C。
5.代碼實現(c):

/*************hanoi.c********************/ #include<stdlib.h> #include <stdio.h> #include "hanoi.h" /*************找x桿頂部盤的編號********** 輸入參數:current[i]記錄第i號盤所在的桿號 x;桿的編號 輸出參數:x桿頂部盤的編號 ****************************************/ int pickTopDisk(char* current,char x) { int i = 0; while (current[i] != x) i++; return i; } /*************漢諾塔********** 輸入參數:current[i]記錄第i號盤所在的桿號 n:盤的數量 A,B,C:桿的編號 ****************************************/ void hanoi(char* current, int n, char A, char B, char C) { static int cout = 0; //static類型變量會在函數屢次調用時保存改變的值,并且初始化操作僅做1次 int i = 0; if (n==1) { i = pickTopDisk(current, A); current[i] = C; cout++; printf("move %d disk %d: %c->%c ", cout, i + 1, A, C); return; } hanoi(current, n - 1, A, C, B); current[n- 1] = C; cout++; printf("move %d disk %d: %c->%c ", cout, n, A, C); hanoi(current, n - 1, B, A, C); }
/****************hanio.h************/ #ifndef _HANOI_H #define _HANOI_H #ifdef __cplusplus extern "C" { #endif // __cplusplus int pickTopDisk(char* current, char x); void hanoi(char* current, int n, char A, char B, char C); #ifdef __cplusplus } #endif #endif
/**************main.c************************/ #include <stdlib.h> #include "hanoi.h" int main(int argc, char** argv) { char current[] = { 'A', 'A', 'A', 'A' }; char A = 'A', B = 'B', C = 'C'; hanoi(current, 4, A, B, C); system("pause"); return EXIT_SUCCESS; }

6運行結果:
這里寫圖片描述

參考:《算法設計、分析與實現:C、C++和Java》 徐子珊

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: av福利在线 | 污污网站入口 | 日韩国产一区在线 | 精品国产精品 | 国产成人在线视频 | 一级淫片免费 | 久久69 | 91久久久久久久久久久久久 | 欧美xxxx黑人又粗又长 | 高清一二三区 | 欧美天堂一区 | 成人午夜精品一区二区三区 | 久久成人一区 | 久久综合国产伦精品免费 | 精品久久久国产 | 国产 日韩 欧美 一区 | 玖玖成人 | 国产专区一区二区三区 | 一区二区三区福利 | 美国成人毛片 | 爆操网站 | 免费观看亚洲 | 一级二级三级黄色片 | 欧美成人免费一级人片100 | 欧美日韩成人网 | 成人免费视频一区二区 | 欧美xxxx视频 | 6080午夜 | 亚洲精品一二 | 日本一二三区免费 | 国产一区二区视频在线播放 | 国产精品视频一区二区三区四区五区 | 欧美日韩在线观看视频 | 日本一区二区视频在线 | 欧美videosdesex高潮 | 色又黄又爽网站www久久 | 尤物在线 | 91久久国产综合久久蜜月精品 | 99视频精选 | 亚洲午夜精品在线 | 热久热久|