宴夜小丑的博客

每朵乌云的背后总是存在着阳光,只要坚持,总会等到!

算法基础(三):递归(二)

慕课:程序设计与算法(二)算法基础 郭玮老师课程的学习笔记

递归进阶运算,继续递归(一)难度提升

1、四则运算表达式计算


表达式本身就是一个递归的定义,表达式由符号和项组成,项又由因子和符号组成,因子由括号表达式和整数组成



所以表达式可以进行递归分析



表达式由项(+、-&项)组成,即如果项后还有项需要调用项方法term_value求项的值


而项里读取因子,项由多个因子和*、/组成,看是否有后续因子需要处理,即more来表示还没有*、/,即是否需要继续处理,如果需要则调用factor_value


因子又由括号表达式和整数组成,如果是表达式又需要调用表达式求值,如果是整数直接计算

因子有两种情况,一种是数字,一种是括号加表达式,所以需要用cin.peek()来看输入流的第一个,不取走

数字则按照十进制,result乘10+数;如果是括号表达式,则用表达式进行计算结果,调用expression_value()

即表达式、项、因子分别调用,组成一个递归形式

2、上台阶


爬楼梯分成两种情况,即走一级或走两级,所以将每种情况分为两部分,从第一步开始,第一步走一级+n-1步,第一步走两级+n-1步,n-1步中第一步又可以分为两种情况,以此类推,总之每次走都有两种情况

边界限制无穷递归的发生,一定要在递归函数中设置递归和边界条件,边界即停止的条件,通过判断可以发现,n可以分为小于0和0,或者0和1,或者1和2等情况,因为每次都计算n-1和n-2所以,要判断最后终止的情况


问题分解,第一步该怎么做根据第一步的做法来分类,剩下的问题就是子问题,子问题跟第一个问题形式相同只是数更少,

还要设置边界条件,即停止的条件,避免无穷递归的发生

3、放苹果


当盘子数大于苹果数,即i个苹果放在k个盘子上,等价于把空盘子都排除,将i个苹果放在i个盘子上

当盘子数小于苹果树,分为两种情况,盘子有空和盘子没空

如果有盘子为空,则等价于把i个苹果放到k-1个盘子,即排除空盘子

如果没有盘子为空,则可以每个盘子先放一个苹果,即每个盘子肯定至少有一个苹果,再分剩下的,则等价于i-k个苹果放到k个盘子的放法


边界条件为:

当没有苹果时,方法为1

当盘子为0时,方法为0

根据每次n-1和m-n来判断,边界条件

递归:

当盘子大于苹果时,将空盘子放一边,等价于将m个苹果放在m个盘子上

其余每种情况分为两种,盘子有空和盘子没空两种

4、算24


边界条件即剩一个数,一个数我们就可以直接判断是不是等于24

除法会造成浮点数,这时不能用==,而要用两个数的差是否小于一个很小的值


辅助的函数,即判断是否等于24和判断浮点数是否为0


枚举所有两个数的计算的可能的计算情况,当两个数是+时,再枚举剩下的数中两个数+的情况,以此类推,把每两个数的计算过程进行枚举,只要有一种情况满足即可,不需计算所有情况




阅读更多
文章标签: 算法
个人分类: 算法
上一篇算法基础(二):递归(一)
下一篇算法基础(四):二分算法
想对作者说点什么? 我来说一句

递归最小二乘算法(RLS)

2011年07月24日 785B 下载

递归偏最小二乘法的简单介绍

2016年04月15日 1.33MB 下载

NCRE二级公共基础部分

2008年10月04日 162KB 下载

栈、队列与递归算法设计

2011年05月04日 26KB 下载

没有更多推荐了,返回首页

关闭
关闭