它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图所示。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放到第二根柱子上,并且规定,每次只能移动一个圆盘,在小圆盘上不能放大圆盘。有人预言说,这件事完成时宇宙会在一瞬间闪电式毁灭,也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。
( 6. 整体的思考,隐形的思考——)
【注意】画图可能会有多种移动方式,但是记住递归函数的本质,是有一定规律的,可以套用自己的,注意选择并找到正确的画图方式
//
//
只有三个柱子,只有一个转移柱,和一个目标柱,再多的盘子,都是在转移柱的帮助下实现的转移,其实就只有三步-(联想一下两个盘子的情形)-,上面的盘子到转移柱上去,底下的盘子到目标柱上去,上面的盘子再回来,这其实都是对称的过程,在转换过程中,每一个盘的目标柱和转移柱有转换的关系。可以用隐形盘子的想法,简单想把上面的盘子移到一个柱子之后在出现一个盘子,这时候的这个盘子就可以直接移到剩下的一根光秃秃的柱子上。(也可以想整体的思路,永远把上面的 n-1个盘子当成整体,往里套,最后在只有一个盘子的时候结束)
要写递归函数强调一下递归函数的作用一定要明确
递归函数的出口要明确
递归的规律一定要写清楚
#include
int i = 1;
void hannuo(int n,char a,char b,char c)//作用:打印把第n块移到目标的过程
{ // 目标柱 转移柱【针对编号为n的盘子】
if (n == 1) {
printf("%d[%d]: %c --> %c\n",i++,n,a,c);//第一次的时候,因为不断在调用,所以这里就是出口
}
else
{
hannuo(n-1, a, c, b);
// 目标柱【针对编号为n-1的盘子】为给n号盘子让路
printf("%d[%d]: %c --> %c\n",i++,n,a,c);
//就是该函数的目的:打印第n块被移到目标柱上
hannuo(n-1, b, a, c);
//依然从n-1号盘子开始往里调用,直到最后一个一号盘子归位结束递归函数
}
}
int main ( )
{
static int n;//静态全局变量的说明,当然可以不用,用全局变量写在外面就好。
scanf("%d",&n);
hannuo(n,'A','C','B');
}
#include
int i = 1;
int n;
void hannuo(int n,char a,char b,char c)
{
if (n == 1) {
printf("%d[%d]: %c --> %c\n",i++,n,a,c);
}
else
{
hannuo(n-1, a, c, b);
printf("%d[%d]: %c --> %c\n",i++,n,a,c);
hannuo(n-1, b, a, c);
}
}
int main ( )
{
scanf("%d",&n);
hannuo(n,'A','C','B');
}
**总结:**多练习递归,理解递归函数,在熟练运用,明白递归函数的三要素。
这个真的不好理解啊,递归和汉诺,但是总算体会到老师说的话,多看别的资料,多结合起来思考,其实我也是白读了好多关于递归的文章,加上一开始自己的执迷不悟,画了半天图,才感觉到那么一点点汉诺塔的思路。在查阅资料的过程中,不要只局限于一种思考方式,多多尝试。有时候单看文字会比较难理解,我觉得代码可以帮助理解。
附言:才开始学一点c语言,还不太熟练,前面文章中可能讲的不太清晰,还请海涵。