首页 > 其他分享 >汉诺塔(经典递归问题)及个人目前的一些感想与心得

汉诺塔(经典递归问题)及个人目前的一些感想与心得

时间:2023-01-23 16:32:04浏览次数:54  
标签:柱子 递归 圆盘 感想 代码 Hanoi 汉诺塔 pos2 pos1

汉诺塔(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个盘子的时候理解起来已经有点费力了,特别是形参的不停的转换,绕的头晕,但是最后我还是理解了这个代码和递归的原理,虽然不可能在脑海中执行一遍这个代码,但是对于汉诺塔递归的原理理解地更加深刻了。

个人感悟:

很多事情,很多代码,很多知识,我们不可能一下就掌握,也不可能两三下就掌握,所以一定要花时间去钻研,初高中的时候,很多知识我很少自己主动地去钻研,因为我讨厌学习,讨厌比来比去,讨厌刷题才能考上好学校,但是现在,没有强制的排名,没有老师逼着你学,学习开始变得为自己而学,这种感觉和以前是完全不一样的,你会开始有了目标和动力。

很多同学都很迷茫(包括之前的我也是),不知道自己怎么做才能停止颓废下去,才能成功,看了很多很多的故事,最后我才幡然大悟:就像他们中很多人说的:” 我努力了几年。“

很多人会习惯性地忽略这句话,因为太理所应当了。但是这才是精髓。静下心来,两三年,每天学习,最后成功。几年日复一日的学习,最终说出来的却只有:我努力了几年。但是只有自己才知道,这句话的涵义远远不止于此。

也有些成功的人会说:”我很幸运。“是的,很多人都很幸运,我也是,在中考的时候,我超常发挥,考上了重点高中,但是机会给了我,我却没有抓住,最后高考嘛,也就那样,比预想的最坏的打算还要再次一点。所以,在机会到来之前,你是否准备好了呢?

突然回看,个人感悟写了一大堆,比代码还长. . . . . .这些感想也是在这几天才突然悟到的,但是由于最近一直没有写博客,所以就借这篇博客顺便发表一下自己对于一些事情的看法。希望无论是对自己还是对大家都有帮助。



标签:柱子,递归,圆盘,感想,代码,Hanoi,汉诺塔,pos2,pos1
From: https://blog.51cto.com/u_15928027/6021930

相关文章

  • 递归:汉诺塔问题
    问题背景汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了3根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着64个黄金圆盘。梵天命令一个叫......
  • 程序:用递归法依次打印1234数字
    #include<stdio.h>voidprint(inta){if(a>9){print(a/10);}printf("%d",a%10);}intmain(){inta=1234;print(a);return0;}......
  • 递归求n的阶乘
    解法:#include<stdio.h>intFacl(intn){intret=1;while(n>=1){ret=n*Facl(n-1);returnret;}return1;}intmain(){intn=0;intret=0;printf("......
  • 程序:用递归法计算字符串长度
    #include<stdio.h>intmy_strlen(char*str){if(*str!='\0')return1+my_strlen(str+1);elsereturn0;}intmain(){intret=0;chararr[]="hibi......
  • PHP递归和循环的速度测试
    本文于2017-12-05重新整理.写了一个可以对$_GET,$_POST等输入进行过滤的函数,递归实现如下:functionarray_map_recursive($filters,$data){ $result=[]; for......
  • Creation station扫码检查的递归查询
    withrecursivenomentree(refse,refcomp,depth)as(select et_refakf_se,et_refakf_comp,1asdepthfromt_nomeninnerjoint_simoont_simo.et_nomen=t_nomen.id_......
  • 如何使用C语言实现汉诺塔
    现有3个柱子A、B、C,有n个圆盘在A柱上,要实现n个圆盘要从A柱从大到小移动到C柱。思路:先将n-1个圆盘移动到B柱上,然后将最后一个圆盘移动到C柱上,最后将B柱上的n-1个圆盘移动到C......
  • C语言:递归函数
      #include<stdio.h>floatfh(intn){if(n==1)return1;elsereturn1/(n-1+1/fh(n-1));}main(){floataa=0;inta,b;for(a=1;fh(a......
  • 递归求字符全排列
    #include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=10;charn[N];charpath[N];boolused[N];voiddfs(intu){i......
  • java:递归算法
    递归算法:就是调用自己的本身。publicclasstest{publicstaticvoidmain(Stringarg[]){Strings="abcde";chara[]=s.toCharArray();testt=newtest()......