經典遞迴演算法 漢諾塔
阿新 • • 發佈:2018-11-22
函式的遞迴 前進(規模縮小),邊界條件,返回段,自己呼叫自己
在寫漢諾塔之前 先給大家介紹下遞迴演算法 舉個例子:我要寫一個我自己的列印函式
Myprint()將12345 這個數 挨個數字 打印出來
void MyPrint(int n)
{
if(n > 10)
MyPrint(n/10);
printf("%d ",n%10);
}
就像上面程式碼塊中 呼叫自己來解決問題的方式
漢諾塔中有三個柱子a,b,c
如果a上面只有一個鉛塊 那麼直接把鉛塊從a挪到c就好了;
如果鉛塊較多就會出現以下情況
在挪動的過程中肯定會把上面的鉛塊通過 c來放到b上去 好讓最大的塊放到c上面 ;然後再通過c把b上面除了最後一塊放到a上面去把b上面最大的放到c上 依次類推;
int g_count = 0; void Move(char x,char y) //通過寫軌跡函式來記錄漢諾塔移動的過程 { g_count++; //記錄移動次數 printf("%c->%c\n",x,y); } void Hanoi(int n,char a,char b,char c) { if(n == 1) { Move(a,c); } else { Hanoi(n-1,a,c,b); // 通過c把n-1的磚塊從a挪到b Move(a,c); //把最大的那塊挪到c上 Hanoi(n-1,b,a,c); // 通過a把n-1的磚塊從b挪到c } } int main() { Hanoi(5,'A','B','C'); printf("%d\n",g_count); return 0; }
程式執行結果:
佛教傳說64個黃金圓盤移動完 宇宙就會毀滅。。。
大家可以試試64個圓盤的結果;
執行完不會毀滅吧。。。