使用递归思想实现汉罗塔问题,青蛙跳台问题以及快速排序算法

首先解释递归思想:递归就是将一个大问题分解成若干个性质相同的小问题(这里可能说的比较抽象,所以本篇的三个问题就是用来为这个举例的)

1.汉罗塔问题3ef0f8ffc272466c95774648eb68ba44.png

 先从该程序的hanluota函数看起,if语句部分留在后面讲解,else语句部分是递归算法,先讲解这个

else部分:我们使用   hanluota这个函数 解决汉罗塔问题,于是便 假设他有  将n个盘子  从 起始柱 借助 中间柱 移动到 目的柱(且符合要求)的能力(即使现在没有实现,可以假设他有这个能力,因为我们完善后的函数一定要具有这种能力,现在直接认为他有这种能力的话,有利于后面递归的思考) ,所以 else语句的含义是 第一句:先 将n-1个盘子 从A柱 借助 C柱 移动到 B柱,也就是说认为此时 A柱上只剩下一个最大的盘子,其他n-1个盘子按照顺序摆放在B柱上,所以此时第二句只需将A柱的盘子移动到C柱(程序中是为了形式统一才这样写,可以换一种写法),第三句的意思是将B柱上存放的n-1个盘子 经由 A柱 移动到C柱,这样全部的n个盘子全都放在了C柱上

if部分:经过上面的讲解,大概知道之后遇到递归该怎么思考了,但是递归外的部分(如本例的if语句里的内容)该怎么写呢?个人理解是:在递归的过程中 hanluota函数的第四个参数(代表盘子的参数)会越来越小,我们要找到一个“基础单元”,也就是说这个问题中所有的动作都可以用这个代替(或者说都要进行这个动作),显然一次只移动一个盘子是最合适的(即if中n=1的时候)

 

补充一下本例if语句用n=2也是可行的,不过也要写明n=1的情况,比较繁琐(因为一次移动两个盘子是一次移动三个盘子的子动作,可以将n=3带入hanluota函数中,自然能理解这句话)(所以移动一个盘子也是移动两个盘子的子动作)(本例n和n-1相隔1,就是说一次递归,移动的盘子数只会减1,就是说要会移动三个盘子,只需要使用 移动两个盘子的方法,以此类推,所以说n>=2时,只需要n==2的代码便可,n==1是为了防止A柱上原本只有一个盘子的情况)

2.青蛙跳台af257addf7114ab6a6d995a48146439e.png

 这个其实和汉罗塔是一个道理,我们快速过

else部分:假设青蛙只跳一节台阶,那么还剩n-1节台阶,如果青蛙跳两节台阶,那么还剩n-2节台阶,这两种情况加起来就是全部情况这种情况

if部分:既有n==1的,又有n==2的,是为了防止例如n等于3带入,就要进行1和2的递归,这两个合起来才是“基础单元”(汉罗塔问题里面 递归 跨度 是1,和本例不同,所以举例子说明)

3.快速排序1264a0ac8f984765baad3542c6fb3d4a.png

 讲解下快速排序原理:任选一个数作为基准数,然后以这个数为基准,使其左边的数都小于他,右边的数都大于他,那么这个数的位置就是正确的,然后进行递归,直到将所有数都排到对应的位置,如果理解递归,理解起这个也是容易的(修改:break后面的第三行注释,应该是  认为  比x(也就是基准数)小的数  一定排在  比x大的数  的左边)

这个不同的是这里面有个while(1)循环,这个是  每确定一个数的准确位置  都要进行的重复操作,不像之前的那样 每一步都可以用“基础单元”代替

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值