经典问题汉诺塔的实现中,递归实现可以说是代码量最少,并最简单易懂的实现方法了。
假设有三根柱子a,b,c。其中a柱子上有n个金片。我们的目的就是把n个金片借助b,全部移动到c上。这是一个汉诺塔问题。
这个问题可以分解成如下子问题:
(1)将n-1个金片从a移动到b。这又是一个汉诺塔问题。
(2)上面执行完之后,可以直接将第n个金片移动到c。
(3)上面两步执行完之后,将n-1个金片从b移动到c。这又再次是一个汉诺塔问题。
很显然,把上面的步骤翻译成递归形式可以得到如下的程序:
1 #include <iostream> 2 using namespace std; 3 void Move(int n,char src,char dst){ 4 cout<<"move "<<n<<" from "<< src<<" to "<<dst<<endl; 5 } 6 void Hannoi(int n,char a,char b,char c){//函数的含义:将n个金片从a借助b移动到c上 7 if(n==1){ 8 Move(1,a,c); 9 } 10 else{ 11 Hannoi(n-1,a,c,b); 12 Move(n,a,c); 13 Hannoi(n-1,b,a,c); 14 } 15 } 16 int main() 17 { 18 int n; 19 while(cin>>n){ 20 Hannoi(n,'a','b','c'); 21 } 22 return 0; 23 }