漢諾塔(hanoi) C語言實現
最近一直在學習C語言,學習了遞迴,準備寫個程式練個手,就找到了漢諾塔,權當入門吧,日後在寫一個走迷宮的,都算是入門比較經典的演算法了。
神話傳說:
法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,並且始終保持上小下大的順序。這需要多少次移動呢?這裡需要遞迴的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。n=64時,
假如每秒鐘一次,共需多長時間呢?一個平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下:
18446744073709551615秒
這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
有預言說,這件事完成時宇宙會在一瞬間閃電式毀滅。也有人相信婆羅門至今還在一刻不停地搬動著圓盤。放心吧,在我們有生之年肯定移動不完的,嘿嘿
現抽取題目如下:
有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子B上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問至少需要多少次移動,設移動次數為H(n)。
首先我們肯定是把上面n-1個盤子移動到柱子C上,然後把最大的一塊放在B上,最後把C上的所有盤子移動到B上,由此我們得出表示式:
H⑴ = 1H(n) = 2*H(n-1)+1 (n>1)那麼我們很快就能得到H(n)的一般式:H(n) = 2^n - 1 (n>0)
並且這種方法的確是最少次數的,證明非常簡單,可以嘗試從2個盤子的移動開始證,你可以試試。
實現:
#include<stdio.h>
void adjust(int, char, char, char);
int main(void)
{
char A = 'A'; /* define three tower */
char B = 'B';
char C = 'C';
int n = 10;
adjust(n,A,B,C);
return 0;
}
void adjust(int n, char A, char B, char C)
{
if (n ==1){
printf("put %d from %c to %c \n",n,A,C);
} else {
adjust(n-1,A,C,B);
printf("put %d from %c to %c\n",n,A,C);
adjust(n-1,B,A,C);
}
}
神話部分摘自 http://baike.baidu.com/view/191666.htm?fr=aladdin
相關文章
- 小知識系列(3):Hanoi塔(漢諾塔,河內塔)
- Python實現:漢諾塔問題Python
- PHP實現漢諾塔演算法PHP演算法
- 漢諾塔-PythonPython
- SQL 漢諾塔SQL
- 遞迴-*漢諾塔遞迴
- 漢諾塔詳解
- 漢諾塔和遞迴遞迴
- 奇怪的漢諾塔 - 題解
- 課時24:遞迴:漢諾塔遞迴
- 遞迴求解漢諾塔問題遞迴
- 漢諾塔遊戲《演算法很美》遊戲演算法
- 雙色Hanoi塔問題
- 漢羅塔問題 java實現Java
- 掃雷--C語言實現C語言
- c語言實現階乘C語言
- 漢諾塔的圖解遞迴演算法圖解遞迴演算法
- python3:遞迴解漢諾塔問題Python遞迴
- 【YbtOJ高效進階 遞推-2】奇怪漢諾塔
- C語言__LINE__實現原理C語言
- C語言實現檔案加密C語言加密
- c語言實現this指標效果C語言指標
- 高精度加法(C語言實現)C語言
- C語言實現TCP通訊C語言TCP
- 從漢諾塔遊戲理解python遞迴函式遊戲Python遞迴函式
- C語言程式設計-漢字點陣C語言程式設計
- 排序演算法-C語言實現排序演算法C語言
- 高精度減法(C語言實現)C語言
- C語言實現推箱子游戲C語言
- C語言實現繼承多型C語言繼承多型
- C語言實現桌面貪吃蛇C語言
- Object-C語言Block的實現方式ObjectC語言BloC
- C 語言實現泛型 swap 函式泛型函式
- PID演算法的C語言實現演算法C語言
- C語言如何實現繼承及容器C語言繼承
- C語言實現矩陣螺旋輸出C語言矩陣
- C語言入門:正,反兩座金字塔C語言
- C#漢字轉漢語拼音C#
- c語言實現貓吃老鼠的問題C語言