當前位置:首頁 » 操作系統 » 漢諾塔演算法

漢諾塔演算法

發布時間: 2022-01-08 18:40:13

1. 漢諾塔演算法

#include <stdio.h>
int main()
{
void hanoi(int n,char one,char two,char three); // 對hanoi函數的聲明
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to move %d diskes:\n",m);
hanoi(m,'A','B','C');
}

void hanoi(int n,char one,char two,char three) // 定義hanoi函數
// 將n個盤從one座藉助two座,移到three座
{
void move(char x,char y); // 對move函數的聲明
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}

void move(char x,char y) // 定義move函數
{
printf("%c-->%c\n",x,y);
}

2. 漢諾塔問題演算法

純手打,自己理解的。看的東就給分吧...
例如n=3
3,A,B,C
{ 2,A,C,B---------------->{1,A,B,C ============>A->C
move(A,B) ============>A->B
1,C,A,B ============>C->B
}
move(A,C) ============>A->C
2,B,A,C------------------>{1,B,C,A ============>B->A
move(B,C) ============>B->C
1,A,B,C ============>A->C
}
}

3. 漢諾塔演算法步驟解析

這是一個遞歸的過程,你要自己搞個簡單例子擺一擺,再看看我的解釋就明白了

hanoi(n-1, A, C, B);//將n-1個盤通過c從a移到b
printf("Move sheet %d from %c to %c\n", n, A, C);//將第n個盤從a移到c
hanoi(n-1, B, A, C);//將n-1個盤通過a從b移到c

4. 漢諾塔問題演算法詳細解答

#include <stdio.h>
void hanio(int n,char a,char b,char c)
{
if(n>=1)
{hanio(n-1,a,c,b);//可以理解為把a上的n-1個盤子通過c移動到b上
printf("%c--> %c\n",a,c);//然後再把a上剩下的一個盤子移動到c上
hanio(n-1,b,a,c);//再把b上的n-1個盤子通過a移動到c上,搞定,遞歸程序,看起來簡單,理解起來稍微有點難度,調試也不容易,你用多了就明白了
}
}
int main ()
{
int n ;
printf("please input the num:\n");
scanf("%d",&n) ;
//盤子數為n,三個柱子分別為ABC
hanio ( n, 'A' , 'B' , 'C' ) ;
return 0;
}

5. 關於漢諾塔演算法的一個問題

首先要弄懂
void fn(int n,char one,char two,char three)
函數的意義,它的功能是,在指定的游戲規則下,把n個盤從one,經two輔助,搬到three。
所以,
fn(n-1,one,three,two);//當此行完成時,上面的n-1個盤已經全部在two上了
move(one,three); //把最底下的one搬到three上
fn(n-1,two,one,three);//把上面搬到two上的n-1個盤搬到three上
最後這些盤子應該全部搬到three上,搬完之後絕不會與接下來的move重復。
move不會輸出one-->two的。

6. 漢諾塔的演算法

演算法介紹:當盤子的個數為n時,移動的次數應等於2^n–1。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放A、B、C;

若n為奇數,按順時針方向依次擺放A、C、B。

所以結果非常簡單,就是按照移動規則向一個方向移動金片:如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C

漢諾塔問題也是程序設計中的經典遞歸問題。

(6)漢諾塔演算法擴展閱讀

由來:

法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的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億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。

7. 漢諾塔演算法問題

if(n==1)
printf("%c-->%c\n",x,z);
else
{ move(n-1,x,z,y);
printf("%c-->%c\n",x,);
move(n-1,y,x,z);

當調用move(1,y,x,z)
就執行if(n==1)
printf("%c-->%c\n",x,z);
接著就回溯到上一層

其實如果你調試一下,一步一步的執行,你就明白了

8. 漢諾塔遞歸演算法是什麼

hanot (n-1,b,a,c);(解釋:在把B塔上的(n-1))個藉助A塔移動到C塔)

為了實現 n個盤從 藉助c 從a 移動到 b

思路如下:

首先考慮極限當只有一個盤的時候,盤直接從 a -> b即可。

當有2個盤的時候,把1號盤從a -> c 然後 把2號盤 a->b 再 把 2好盤從 c - > b。

當有n個盤的時候,把 n-1個 盤 藉助 b 移動到 c 然後將 n號盤從 a -> b。

這時候只要將 n-1想辦法從c移動到 b 藉助 a 那麼就可以先把 n-2個盤藉助b移動到a。

遞歸,就是在運行的過程中調用自己。

構成遞歸需具備的條件:

1,子問題須與原始問題為同樣的事,且更為簡單;

2,不能無限制地調用本身,須有個出口,化簡為非遞歸狀況處理。

在數學和計算機科學中,遞歸指由一種(或多種)簡單的基本情況定義的一類對象或方法,並規定其他所有情況都能被還原為其基本情況。

以上內容參考:網路-遞歸公式

9. 漢諾塔的演算法(用VC++實現)

給你的c的演算法吧
void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);
else{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
你自己可以定義這個move(x,n,z),這就是一個顯示移動的函數。典型的遞歸問題。好好捉摸下吧。

熱點內容
單片機android 發布:2024-09-20 09:07:24 瀏覽:760
如何提高三星a7安卓版本 發布:2024-09-20 08:42:35 瀏覽:660
如何更換伺服器網站 發布:2024-09-20 08:42:34 瀏覽:308
子彈演算法 發布:2024-09-20 08:41:55 瀏覽:285
手機版網易我的世界伺服器推薦 發布:2024-09-20 08:41:52 瀏覽:813
安卓x7怎麼邊打游戲邊看視頻 發布:2024-09-20 08:41:52 瀏覽:159
sql資料庫安全 發布:2024-09-20 08:31:32 瀏覽:90
蘋果連接id伺服器出錯是怎麼回事 發布:2024-09-20 08:01:07 瀏覽:504
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:655
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:479