探究汉诺塔的算法
1、问题本质
汉诺塔源于印度传说中,大梵天创造世界是早了三根金刚石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
2、问题分析
(1)首先我们将这三根柱子定为a柱,b柱,c柱,如图一。
(2)我们的主要目的就是将a柱上所有的盘子都移动到c柱上,在进行转移操作时,都必须保证大盘在小盘下面,且每次只能移动一个圆盘,最后c柱上有所有的盘子且也是从上到下按从小到大的顺序。
(3)首先如果我们想把a柱上的盘子都移到c柱上,就必须先把最大的盘子先放到c柱上,所以我们的第一步是要将除了最大的盘子以外的所有盘子全都移到b柱上。
(4)这时我们就可以将a柱当作基准柱,b柱是我们的目标柱,但由于汉诺塔规定必须保证大盘子要在小盘下面,所以我们这个时候需要借助一根柱子作为一个暂时存放的地方,c柱就是最合适的选择,经过一番移动,如图二,成功的将a柱上最大的盘子移动到c柱上。
(5)接下来将b柱上的所有盘子都移动到c柱上,一下子b柱就成为了基准柱,而c柱成为了目标柱,我们也将借助a柱来进行盘子的移动。最后,我们就成功的按照规则将所有的盘子移动到c柱上,如图三。
...
#include<iostream>
using namespace std; //实验对象是n个盘子
void move(char src,char dest)
{
cout<<src<<"-->"<<dest<<endl;
}
void hanoi(int n,char src,char mediun,char dest)
{
if(n==1)
move(src,dest);
else
{
hanoi(n-1,src,dest,medium); //将a柱上的n-1个盘子移动到b柱
move(src,dest); //将a柱上最大的盘子移动到c柱
hanoi(n-1,medium,src,dest); //将b柱上的n-1个盘子移动到c柱
}
}
int main()
{
int m;
cout<<"Enter the number of diskesL";
cin>>m;
cout<<"the steps to moving"<<m<<"diskes:"<<endl;
hanoi(m,'A','B','C');
return 0;
}
...
我简单用3个盘子来实现汉诺塔的具体过程,如图四
3、总结
我们对汉诺塔的解决方式主要运用递归的方式,递归算法的关键就在于递归中重复的步骤,然后递归都是在重复那一关键步骤,递归代码可读性好,并且体现了数学的美。
原文:https://www.cnblogs.com/xlog/p/11502988.html