汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(先上一段搜狗的介绍,哈哈哈,我感觉我说的没这么清楚)
所以就明确了,我们需要通过变成解决上述问题,为了使得步骤能够清楚显示,所以我们 首先写一个打印移动路径的函数如下
void move(char a,char c)
{
printf("%c->%c\n",a,c);
}
然后接下来想办法解决汉诺塔问题
我们首先考虑若是只有一层,问题则直接由a移动到c,就解决了
若是两层
三层的话,就可以发现和两层有相似之处了,先把上边的两层从a通过c移动到b,然后把a的最后一层,直接移动到c,再把b的两层,通过a移动到c,所以我们发现了规律不论是几层,我们都先把上边的n-1层从a通过c移动到b,然后把a剩下的最后一层直接移动到c,最后把b上的n-1层从b通过a移动到c,这样汉诺塔的问题就解决了
接下来是汉诺塔的实现
void hannuota(int n,char a,char b,char c)
{
if(n == 1)//如果是一层,就直接从a移动到c
{
move(a,c);
}
else
{
hannuota(n-1,a,c,b);//否则就先将n-1层从a通过c移动到b
move(a,c);//a到c
hannuota(n-1,b,a,c);//最后b的n-1层通过a移动到c
}
}
下述是4层实现结果
很多循环的问题都可以用递归来实现,但是大部分都不适合用递归,但是汉诺塔问题是一个很适合用递归实现的问题,结果明了,下次写斐波那契数列分别用递归和循环实现。