⑴ 漢諾塔遞歸演算法
1個只要1次2個碟子要3次3個要7次歸納法可以推得復雜度為2^n-1這個可以證明的,只是證明很復雜。
⑵ 漢諾塔 遞歸演算法的詳細解釋請教高手
為了實現 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
然後 把n-1號盤從c-> b如此遞歸就是了!
#include <stdio.h>
void mov(int n,char a,char b)
{
printf("盤%d : 從 %c ---> %c\n",n,a,b);
}
void Hanoi(int n,char a,char b,char c)
{
if(n == 0) return ;
Hanoi(n-1,a,c,b);
mov(n,a,b);
Hanoi(n-1,c,b,a);
}
int main()
{
Hanoi(2,'a','b','c');
return 0;
}
⑶ 漢諾塔遞歸演算法是什麼
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,不能無限制地調用本身,須有個出口,化簡為非遞歸狀況處理。
在數學和計算機科學中,遞歸指由一種(或多種)簡單的基本情況定義的一類對象或方法,並規定其他所有情況都能被還原為其基本情況。
以上內容參考:網路-遞歸公式
⑷ 漢諾塔問題(編程)
可是非遞歸就有一點糾結了哈
⑸ 漢諾塔問題演算法詳細解答
#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;
}
⑹ 漢諾塔演算法
#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);
}
⑺ 漢諾塔演算法問題
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);
接著就回溯到上一層
其實如果你調試一下,一步一步的執行,你就明白了
⑻ 漢諾塔演算法步驟解析
這是一個遞歸的過程,你要自己搞個簡單例子擺一擺,再看看我的解釋就明白了
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
⑼ 漢諾塔問題演算法
純手打,自己理解的。看的東就給分吧...
例如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
}
}
⑽ 關於漢諾塔的演算法問題
我也是學到這有點難 遞歸是有點難感覺 指針也是 這個題到現在我也是半理解的 遞歸主要還要看有一個第幾層的關系 程序先遞歸到最底層 再從最底層得到結果在一層層的上來 期間的過程就輸出了結果