方法递归
一、递归的形式和特点
(1)什么是方法递归?
●方法直接调用自己或者间接调用自己的形式称为方法递归( recursion) 。
●递归做为一种算法在程序设计语言中广泛应用。
(2)递归的形式
●直接递归:方法自己调用自己。
●间接递归:方法调用其他方法,其他方法又回调方法自己。
(3)方法递归存在的问题?
●递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象。
二、递归的算法流程、核心要素
(1)案例(递归案例导学:计算1-n的阶乘)
需求:计算1-n的阶乘的结果,使用递归思想解决,我们先从数学思维上理解递归的流程和核心点。
分析:
①假如我们认为存在一个公式是 f(n) = 1 * 2 * 3 * 4 * 5 * 6 * 7 * … ( n - 1 ) * n;
那么公式等价形式就是: f(n) = f(n-1) *n
②如果求的是 1-5的阶乘 的结果,我们手工应该应该如何应用上述公式计算。
③f(5) = f(4) * 5
f(4) = f(3) * 4
f(3) = f(2) * 3
f(2) = f(1) * 2
f(1) = 1
(2)递归解决问题的思路
●把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
(3)递归算法三要素
●递归的公式: f(n) = f(n-1) * n;
●递归的终结点:f(1)
●递归的方向必须走向终结点:
f(5) = f(4) * 5
f(4) = f(3) * 4
f(3) = f(2) * 3
f(2) = f(1) * 2
f(1) = 1
三、递归常见案例
(1)案例(递归案例导学-计算1-n的和)
需求:计算1-n的和的结果,使用递归思想解决,我们先从数学思维上理解递归的流程和核心点。
分析:
①假如我们认为存在一个公式是 f(n) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + …(n-1) + n;
②那么公式等价形式就是: f(n) = f(n-1) + n
③递归的终结点:f(1) = 1
⑤如果求的是1到5的和的结果,应该如何计算。
f(5) = f(4) + 5
f(4) = f(3) + 4
f(3) = f(2) + 3
f(2) = f(1) + 2
f(1) = 1
四、递归的经典问题-猴子吃桃问题
猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个;第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个;以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个;等到第10天的时候发现桃子只有1个了。
需求:请问猴子第一天摘了多少个桃子?
分析:整体来看,每一天都是做同一个事件,典型的规律化问题,考虑递归三要素
递归公式: f(n) - f(n)/2 - 1 = f(n+1)
即f(n) = 2 * f(n+1) + 2
递归终结点:f(10) == 1
递归方向:
f(1) = f(2) * 2 +2
f(2) = f(3) * 2 +2
…
f(8) = f(9) * 2 + 2
f(9) = f(10) * 2 + 2
f(10) = 1
五、非规律化递归案例-文件搜索
需求:文件搜索、从E盘中,搜索出某个文件名称并输出绝对路径。
分析:
①先定位出的应该是一级文件对象
②遍历全部一级文件对象,判断是否是文件
③如果是文件,判断是否是自己想要的
④如果是文件夹,需要继续递归进去重复上述过程
六、非规律化递归案例-啤酒问题
需求:啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,
请问10元钱可以喝多少瓶酒,剩余多少空瓶和盖子。
答案:15瓶 3盖子 1瓶子