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

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

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

1、四则运算表达式计算

算法基础(三):递归(二)_第1张图片

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

算法基础(三):递归(二)_第2张图片

算法基础(三):递归(二)_第3张图片

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

算法基础(三):递归(二)_第4张图片

算法基础(三):递归(二)_第5张图片

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

算法基础(三):递归(二)_第6张图片

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

算法基础(三):递归(二)_第7张图片

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

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

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

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

2、上台阶

算法基础(三):递归(二)_第8张图片

算法基础(三):递归(二)_第9张图片

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

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

算法基础(三):递归(二)_第10张图片

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

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

3、放苹果

算法基础(三):递归(二)_第11张图片

算法基础(三):递归(二)_第12张图片

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

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

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

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

算法基础(三):递归(二)_第13张图片

边界条件为:

当没有苹果时,方法为1

当盘子为0时,方法为0

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

递归:

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

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

4、算24

算法基础(三):递归(二)_第14张图片

算法基础(三):递归(二)_第15张图片

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

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

算法基础(三):递归(二)_第16张图片

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

算法基础(三):递归(二)_第17张图片

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




你可能感兴趣的:(算法)