您的位置:首页 > 其它

浅谈递归、迭代、循环、遍历 以及用递归思想求解汉诺塔(hanoi)问题、斐波那契数列、累加问题

2020-02-29 20:39 274 查看

概念介绍:

循环:在满足条件的情况下,重复执行同一段代码来解决问题的方法,如while循环。

递归:通过直接或间接的反复在函数内部调用自身来解决问题的方法。

迭代:按顺序访问线性结构中的每一项,如for循环。

遍历:按照一定的规则访问非线性结构中的每一项。

 

循环我其他文章里面介绍过啦~如果大家感兴趣,可以去我的博客主页看看吧~里面详细讲了for循环以及一些经典的练习题,如打印金字塔等,在清楚for循环 循环结构体里面的循环的初始化 ,循环的继续条件和循环的步长 是如何得来的同时大家也可以更好地理解迭代思想。何乐而不为呢?今天我主要想跟大家分享一下我对 递归 的理解。

说到递归,就得先说说 分治 。何为分治呢

分治其实是一种算法思想,它主要是将一些复杂的大问题进行拆分,拆分成若干个与原问题性质类似的小问题,这些小问题相对而言比较简单,可以方便的对其进行求解,那么最终将每个小问题的解进行合并得到原问题的解的过程就是我们所说的分治思想啦。

而递归就是运用分治的思想来解决问题的。那么何为递归呢?递归递归,先递后归。

递归与迭代的区别:

递归就是,你爱人与你的相爱过程,你们遇见、暧昧、相恋,最终你们会拿着结婚证走进婚姻的殿堂。总而言之就是有结果。而迭代就是 你遇见渣男了,一直暧昧,走不进婚姻的殿堂没结果。看到没?递归是你爱人爱你有结果,迭代是你爱渣男没结果。正经来说就是,递归是逆向思维代码比较整洁简单有结果,而迭代是正向思维代码比较繁琐没结果。

 

问题1:累加问题:计算1+2+3+4+……+98+99+100

解题思路:假设 f(n) 是求1~n的累加,那么求解f(100)就是我们当前最大的问题。按照做题步骤,先对其进行拆分,直到拆的不能再拆的时候,对其进行求解,最后向上返回即可。图示如下(↓)一定要记住,先递再归。

代码展示:

[code]    public static int f(int n){
if(n==1){
return 1;
}
return f(n-1)+n;
}

 

递归的解题步骤分为那几步呢?

  • 前进段:指的就是将问题从大化小
  • 结束段:不断分解小问题直到可以方便求出小问题的解为止
  • 返回段:将小问题处理完毕之后,向上返回(有些问题是不需要返回的)

 

问题2:Hanoi问题(汉诺塔)

问题简介:汉诺塔是一个发源于印度的益智游戏,也叫河内塔。相传它源于印度神话中的大梵天创造的三个金刚柱,一根柱子上叠着上下从小到大64个黄金圆盘。大梵天命令婆罗门将这些圆盘按从小到大的顺序移动到另一根柱子上,其中大圆盘不能放在小圆盘上面。当这64个圆盘移动完的时候,世界就将毁灭。 那么好多人会问64个圆盘移动到底会花多少时间?那么古代印度距离现在已经很远,这64个圆盘还没移动完么?我们将通过递归算法来计算来看看要完成这个任务到底要多少时间?

算法讲解:最大的问题将X上的三个盘子上放到Z上,以3个为例:

最初的3个圆环都在X上面放着,目的是将X上面的3个圆环放在Z上,即X->Z ,

第一步:先将前一个从X移到Z,再将第二个从X移到Y,再将前一个从Z移到Y()

第二步:将第三个从X移到Z

第三步:先将前一个从Y移到X,再将第二个从Y移到Z,再将前一个从X移到Z()

总结:要想把3个从X移到Z,先得把前两个从X 移到 Y,再把第三个从X移到Z,最后再把前两个从Y移到Z即可。

那么64层汉诺塔对应的就是:先把前63个 X->Y,再把第64个 X->Z,最后把前63个 Y->Z即可。

 

代码展示
        

[code]class Hanno{
public static void main(String[] args){
//盘子的个数 出发 中间 目的
hanno(64,"X","Y","Z");
}
public static void hanno(int n,String begin,String mid,String end){
if(n==1){
System.out.println(begin+" -> "+end);
}else{
hanno(n-1,begin,end,mid);
System.out.println(begin+" -> "+end);
hanno(n-1,mid,begin,end);
}
}
}

 

程序给出的就是移动的路径,经过计算要移完64个盘子大约得移动18446744073709551615次。
我们假设移动一次圆盘为一秒,那么一年为31536000秒。那么18446744073709551615/31536000约等于584942417355天,换算成年为5845.54亿年。 
目前太阳寿命约为50亿年,太阳的完整寿命大约100亿年。所以我们整个人类文明都等不到移动完整圆盘的那一天。

 

问题3:斐波那契数列  1 1 2 3 5 8 13 21 34 55 ......

代码展示:

[code]public static int fibo(int n){
if(n==1||n==2){
return 1;
}
return fibo(n-1)+fibo(n-2);
}

 

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
MillionSong 发布了19 篇原创文章 · 获赞 26 · 访问量 3522 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: