传说婆罗门庙里有一个塔台,台上有3根标号为A,B,C的用钻石做成的柱子,在A柱子上放着64个金盘,每一个都比下面的略小一些。把A柱子上的金盘子全部移到C柱上的那一天就是世界末日。移到的条件是:一次只能移到一个金盘,移到过程中大金盘不能放在小金盘上面。庙里的僧人一直在移个不停。因为全部的移动是264-1次,如果每秒移动一次的话需要500亿年。
思考:这是一个典型的递归算法。我们要做到把64个金盘传到C柱上,我们需要:
1.首先把前63个盘子全部移到B柱上。
2.然后把最下面的盘子移动到C柱上。
3.最后将前63个盘子移动到C柱上。
可以推出这样一个设计思路:
1.把前n-1个盘子从A柱移动到B柱。
2.把第n个盘子从A柱移动到C柱。
3.把前n-1个盘子从B柱移动到C柱。
递归的思想在第1步和第3步中得到体现,从n个盘子减少为n-1个盘子,继续下去的第1、3步就是从n-1步减少到n-2步,直至减少到n=1这个已知的条件。
下面是编程实现:
// Hanoi.cpp :
//
#include "stdafx.h"
#include <iostream>
using namespace std;
void move(int n, char a, char b, char c)
{
if (1==n)
{
cout<<a<<" --> "<<c<<endl;
}
else
{
move(n-1, a,c,b);
cout<<a<<" --> "<<c<<endl;
move(n-1,b,a,c);
}
}
int main()
{
int n;
cout<<"Please enter the layers of Hanoi: ";
cin>>n;
move(n, 'A', 'B', 'C');
system("pause");
return 0;
}
以3层为例输出结果为: