hanoi塔問題的遞迴實現
阿新 • • 發佈:2019-02-02
一、背景故事
法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。(來自百度百科)
二、問題描述
假設有x,y,z三座塔座。在塔座x上有n個直徑各不相同、依次從小到大的編號為1,2.........,n的圓盤。現要求將x座上的盤子移動到z上,移動要求如下:
1、一次只能移動一個盤子。
2、盤子只能插在x,y,z的某個塔座上。
3、任何時刻不能將較大的盤子壓在較小的盤子上。
如何移動盤子呢?當只有一個盤子時,即n=1。此時直接將x上的盤子移動到z上即可。當n等於2時,先將第一個盤子移動到y上,再將第二個盤子移動到z上,最後將y上的盤子移動到z上。當n大於1的時候,將上面n-1個盤子通過z移動到y上,再將x上的一個盤子移動到z上,再將y上的盤子通過x移動到z上......
三、程式
#include<stdio.h> void hanoi(int n,char a,char b,char c) { if(n==1) printf("%c-->%c\n",a,c); else { hanoi(n-1,a,c,b);//將a上的盤子通過c移動到b上,這句話很好 printf("%c-->%c\n",a,c);//可以仔細想想這c是什麼柱子,挺好玩的 hanoi(n-1,b,a,c); } } void main() { hanoi(5,'x','y','z'); }