汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,问:什么时候可以完成?
现在,我们从一个圆盘开始,假设三个柱子,ABC,从A放到C,中间的是B,我们:A->C;
两个圆盘:A->B; A->C; B->C;
三个:A->C; A->B; C->B; A->C; B->A; B->C;A->C;
. . . . . .
最后,我们会发现一个规律:我们都是要把A柱子上除了最底下的柱子,全部放到B上,再把最大的盘子放到C上,再把B上的柱子都放到C上。
于是,我们用递归的方法写出下面的代码:
1.Move 函数:用来打印过程及最终的次数
int count = 0;
void Move(char pos1, char pos2)
{
printf("%c->%c ", pos1, pos2);
count++;
}
2.Hanoi函数:即上面找到的规律
void Hanoi(int n, char pos1, char pos2, char pos3)//第二个形参是刚开始的柱子,第四个是目标柱子
{
if (n == 1)
Move(pos1, pos3);
else
{
Hanoi(n - 1, pos1, pos3, pos2);
Move(pos1, pos3);
Hanoi(n - 1, pos2, pos1, pos3);
}
}
3.main函数:
int main()
{
int n = 0;
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
printf("\n");
printf("%d", count);
printf("\n");
return 0;
}
按理来说,这个代码已经完成了,但是对于我而言,这个规律的实现我还不是很懂,递归就是代码简洁,但是有的时候却并不明了。计算机可以很好的执行这个代码,但是对于我们却有些费力。
所以,我花了很多时间去调试代码,在草稿纸上画图,到3个盘子的时候理解起来已经有点费力了,特别是形参的不停的转换,绕的头晕,但是最后我还是理解了这个代码和递归的原理,虽然不可能在脑海中执行一遍这个代码,但是对于汉诺塔递归的原理理解地更加深刻了。
个人感悟:
很多事情,很多代码,很多知识,我们不可能一下就掌握,也不可能两三下就掌握,所以一定要花时间去钻研,初高中的时候,很多知识我很少自己主动地去钻研,因为我讨厌学习,讨厌比来比去,讨厌刷题才能考上好学校,但是现在,没有强制的排名,没有老师逼着你学,学习开始变得为自己而学,这种感觉和以前是完全不一样的,你会开始有了目标和动力。
很多同学都很迷茫(包括之前的我也是),不知道自己怎么做才能停止颓废下去,才能成功,看了很多很多的故事,最后我才幡然大悟:就像他们中很多人说的:” 我努力了几年。“
很多人会习惯性地忽略这句话,因为太理所应当了。但是这才是精髓。静下心来,两三年,每天学习,最后成功。几年日复一日的学习,最终说出来的却只有:我努力了几年。但是只有自己才知道,这句话的涵义远远不止于此。
也有些成功的人会说:”我很幸运。“是的,很多人都很幸运,我也是,在中考的时候,我超常发挥,考上了重点高中,但是机会给了我,我却没有抓住,最后高考嘛,也就那样,比预想的最坏的打算还要再次一点。所以,在机会到来之前,你是否准备好了呢?
突然回看,个人感悟写了一大堆,比代码还长. . . . . .这些感想也是在这几天才突然悟到的,但是由于最近一直没有写博客,所以就借这篇博客顺便发表一下自己对于一些事情的看法。希望无论是对自己还是对大家都有帮助。