第五讲递推与递归课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第五讲递推与递归课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 讲递推 递归 课件
- 资源描述:
-
1、1第五讲 递推与递归主要内容递推及其应用递归及其应用 2整 体 概 述THE FIRST PART OF THE OVERALL OVERVIEW,P L E A S E S U M M A R I Z E T H E C O N T E N T第一部分3第五讲 递推与递归递推是通过数学推导,将复杂的运算化解为若干重复的简单运算,以充分发挥计算机擅长重复处理的特点。递归是将复杂的操作分解为简单操作的多次重复,一般用函数调用完成。411.1 递 推511.1 递 推611.1 递 推例如:Fibonacci数列问题 已知:F(1)=0 ,F(2)=1,若:n2,则F(n)=F(n-1)+F(n-
2、2)注意:1)每个数据项都和它前面的若干个数据项(或后面的若干个数据项)有一定的关联-递推关系式。2)从初始的一个或若干数据项出发,通过递推关系式逐步推进,从而得到最终结果。711.1 递 推注意:3)递推必须有“边界”。4)解决递推类型问题有三个重点:如何建立正确的递推关系式;递推关系有何性质;递推关系式如何求解。基础,重点811.1 递 推按照推导问题的方向,递推分为:l 顺推法:从初始数据开始推理。例如:n=0n=0时,n!=1n!=1;n1n1时,n!=nn!=n*(n-1)!(n-1)!l 倒推法:从结果数据开始推理。例如:n!=nn!=n*(n-1)!(n-1)!;边界:n=0n=
3、0,n!=1n!=19例1:猴子第1天摘下若干个桃子,当即吃了一半又一个。第2天又把剩下的桃吃了一半又一个,以后每天都吃前一天剩下的桃子的一半又一个,到第10天猴子想吃时,只剩下一个桃子。问:猴子第1天一共摘了多少桃子?分析:已知条件:第 10 天剩下 1 个桃子;隐含条件:每一次前一天的桃子个数等于后一天桃子的个数加 1 的 2 倍。逆向思维:从后往前推,可用倒推法求解。10#include void main()int i,a=1;for(i=9;i=1;i-)a=(a+1)*2;printf(a=%dn,a);例1:逆推法-求解猴子吃桃子11例2:猴子分食桃子1)五只猴子采得一堆桃子,猴
4、子彼此约定隔天早起后再分食。2)半夜里,一只猴子偷偷起来,把桃子均分成五堆后,发现还多一个,它吃掉这桃子,并拿走了其中一堆。3)第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃掉这个桃子,并拿走了其中一堆。第三只,第四只,第五只猴子都依次如此分食桃子。问:五只猴子采得一堆桃子数最少应该有几个呢?逆推法12算法分析:先要找第N只猴子和其面前桃子数的关系。如果从第1只开始往第5只找,不好找,但如果思路一变,从第N到第1去,可得出下面的推导式:第N只猴 第N只猴前桃子数目5 s5=x4 s4=s5*5/4+13 s3=s4*5/4+12 s2=s3*5/4+11 s1=s2*5/4+1通过
5、递推,求出s1即可例2:猴子分食桃子-逆推法注意:其中的s1、s2、s3、s4、s5必须是整数13/例2:猴子分食桃子-逆推法#include void main()int x,s,k,i;x=6;/最少的初值k=0;/整除标志while(k!=4)s=x;k=0;for(i=4;i=1;i-)if (s%4=0)k+;else break;s=s*5/4+1;x=x+5;printf(s=%dn,s);1411.1.2 递推设计实例例11.1:母牛的故事 问题描述:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。编程实现:在第n年的时候,共有多少头母牛
6、?15例11.1:母牛的故事-顺推法 设数组f(i)表示第 i 年的母牛总数,则第 n 年的母牛总数为f(n)。f(n)与两个值有关 在本年之前就已经出生的母牛数目 在本年新出生的小母牛数目。1)本年之前就已经出生的母牛数目,实际上就是前一年的母牛总数-f(n-1)。2)由于每一头母牛每年只生育一头小母牛,所以在本年新出生的小母牛数目,实际上是到今年可以生育的母牛的数目。3)而每头小母牛从第四个年头才开始生育,所以今年可以生育的母牛的数实际上就是三年前的母牛总数,即为f(n-3)。16例11.1:母牛的故事-顺推法递推公式:f(n)=f(n-1)+f(n-3)(n=4)f(1)=1;f(2)=
7、2;f(3)=3;递推边界17 若数组f(i)表示第 i 年的母牛总数,则第 n 年的母牛总数为f(n)。18例11.1:母牛的故事-顺推法#include void main()_int64 f50;/_int64 -定义大整数 int i,n;scanf(%d,&n);f1=1;f2=2;f3=3;for(i=4;i=n;i+)fi=fi-3+fi-1;printf(%I64dn,fi);/%I64d大整数输入/输出格式 19例11.2 骨牌问题-顺推法20例11.2 骨牌问题-顺推法21例11.2 骨牌问题-顺推法 22 例11.2 骨牌问题-顺推法23因此,n块骨牌的铺法是首块骨牌横铺
8、方式的铺法与竖铺方式的铺法之和。即:f(n)=f(n-1)+f(n-2)边界:f(1)=1 ,f(2)=2例11.2 骨牌问题-顺推法递推公式24#includeint main()int i,n,f20;f0=1;f1=2;/边界 scanf(%d,&n);for(i=2;in;i+)fi=fi-1+fi-2;/递推 printf(%dn,fi);例11.2 骨牌问题25#includevoid main()int i,n;_int64 f50;f0=1;f1=2;/边界 scanf(%d,&n);for(i=2;in;i+)fi=fi-1+fi-2;/递推 printf(%I64dn,fn
9、-1);例11.2 骨牌问题-顺推法26问题描述:设有一个共有n级的楼梯,某人每步可走1级,也可走2级,也可走3级。问:求从底层开始走完全部楼梯的有多少种走法。例如,当n=3时,走法如下:1+1+1 1+2 2+1 3思考:上楼问题n=3,共有4种走法27n的值 走法f(n)1 1 2 2 3 4 4 7从递推的思想出发,可以设想,从第4 4项开始,每1 1项等于前面3 3项的和。上楼问题-算法分析 f(n)=f(n-1)+f(n-2)+f(n-3)-递推公式 f(1)=1,f(2)=2,f(3)=4-递推边界28#include /上楼问题 void main()int x,n,i,a,b,
10、c;scanf(%d,&n);a=1;b=2;c=4;if(n=1)x=1;else if(n=2)x=2;else if(n=3)x=4;for(i=4;i=n;i+)x=a+b+c;a=b;b=c;c=x;printf(%d,x);29例11.3 错排信件问题描述:某人写了n封信和n个信封,所有的信都装错了信封。要求:若所有的信都装错信封,共有多少种不同情况?30例11.3 错排信件找规律:对n封信以及n个信封各自按照从 1.n 进行编号;f(n)-n个编号的信放在n个编号的信封,各不对应的方法数;f(n-1)-n-1个编号的信放在n-1个编号位置的信封,各不对应的方法数。31例11.3
11、错排信件找规律:第一步:把第n封信放在第k个信封(kn),不对应的共有n-1种方法;第二步:放编号为 k 的信,有两种情况:1)放编号为 k 的信放到第n个信封,则对于剩下的n-2封信,需要放到剩余的n-2个信封且各不对应,就有f(n-2)种方法;2)放编号为 k 的信不放到位置n,对于这n-1封信,放到剩余的n-1个信封且各不对应,有f(n-1)种方法;结论:f(n)=(n-1)*(f(n-2)+f(n-1)特例:f(1)=0,f(2)=1 -边界32例11.3 错排信件#includevoid main()int i,n,f20;f1=0;f2=1;scanf(%d,&n);for(i=3
12、;i=n;i+)fi=(i-1)*(fi-2+fi-1);printf(%dn,fi);33例11.4 马踏过河卒-选讲 棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如下图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点(如下图中的C点和P1,P2,P8)。卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数),同样马的位置坐标是需要给出的,CA且CB。编程:输入n,m,计算出卒从A点能够到达B点的路径的条数。34例11.4 马踏过河卒-选讲 马踏过河卒是一道很老的
13、题目,一些程序设计比赛中也经常出现过这一问题的变形。一看到这种类型的题目容易让人想到用搜索来解决,但盲目的搜索仅当n,m=15就会超时。可以试着用递推来进行求解。根据卒行走的规则,过河卒要到达棋盘上的一个点,只能有两种可能:从左边过来(左点)或是从上面过来(上点),所以根据加法原理,过河卒到达某一点的路径数目,就等于其到达其相邻的上点和左点的路径数目之和,因此可用逐列(或逐行)递推的方法求出从起点到终点的路径数目。障碍点(马的控制点)也完全适用,只要将到达该点的路径数目设置为0即可。35例11.4 马踏过河卒-选讲 用二维数组元素fijfij表示到达点(i i,j j)的路径数目;用gijgi
14、j表示点(i i,j j)是否是对方马的控制点;若gij=0gij=0表示不是对方马的控制点,gij=1gij=1表示是对方马的控制点。则可以得到如下的递推关系式:fij=0 fij=0 当 gij=1gij=1 fi0=fi-10 fi0=fi-10 当 i i0,gij=00,gij=0 f0j=f0j-1 f0j=f0j-1 当 j j0,gij=00,gij=0 fij=fi-1j+fij-1 fij=fi-1j+fij-1 当 i i0,j0,j0,gij=00,gij=0 递推边界:f00=1 36#include /马踏过河卒 int main()int i,j,n,m,f202
15、0,g2020,x,y;scanf(%d%d%d%d,&n,&m,&x,&y);for(i=1;i=n;i+)for(j=1;j=m;j+)fij=0;for(i=0;i=n;i+)for(j=0;j=m;j+)gij=0;gxy=1;gx-1y-2=1;gx+1y-2=1;gx-2y-1=1;gx+2y-1=1;gx-2y+1=1;gx+2y+1=1;gx-1y+2=1;gx+1y+2=1;37for(i=1;i=n;i+)if(gi0!=1)fi0=1;else for(;i=n;i+)fi0=0;for(j=1;j=m;j+)if(g0j!=1)f0j=1;else for(;j=m;j
16、+)f0j=0;for(i=1;i=n;i+)for(j=1;j=m;j+)if(gij=0)fij=fi-1j+fij-1;printf(%dn,fnm);return 0;38例11.4 马踏过河卒改进为了更简洁地表示马的控制点,可以引入两个一维数组,分别用来统计从马的初始位置可以横向移动的位移与纵向移动的位移。程序的改进如下:#includeint main()int dx9=0,-2,-1,1,2,2,1,-1,-2;int dy9=0,1,2,2,1,-1,-2,-2,-1;int n,m,x,y,i,j;int f2020=0,g2020=0;scanf(%d%d%d%d,&n,&
17、m,&x,&y);gxy=1;39例11.4 马踏过河卒for(i=1;i=0)&(x+dxi=0)&(y+dyi=m)gx+dxiy+dyi=1;for(i=1;i=n;i+)if (gi0!=1)fi0=1;else for(;i=n;i+)fi0=0;for(j=1;j=m;j+)if(g0j!=1)f0j=1;else for(;j=m;j+)f0j=0;for(i=1;i=n;i+)for(j=1;j=m;j+)if(gij=1)fij=0;else fij=fi-1j+fij-1;printf(%dn,fnm);return 0;40 递推应用:王小二切饼,要求每2条线都有交点。4
18、1 找规律:王小二切饼,要求每2条线都有交点。规律:p(n)=p(n-1)+n42#include /用递推求解-切饼问题int main()int n,i;int p100;p0=1;scanf(%d,&n);for(i=1;i=n;i+)pi=pi-1+i;printf(%dn,pi);return 0;43递推思考输出杨晖三角形的前10行。杨晖三角形的前5行如左下图所示。问题分析:观察左上图不太容易找到规律,但如果将左上图转化为右上图就不难发现杨辉三角形其实就是一个二维表(数组)的下三角部分。44#include /打印杨辉三角形 void main()int i,j,a1010;for
19、(i=0;i10;i+)ai0=1;for(i=0;i10;i+)for(j=i+1;j10;j+)aij=0;for(i=1;i10;i+)for(j=1;j=i;j+)aij=ai-1j-1+ai-1j;for(i=0;i10;i+)for(j=0;j=i;j+)printf(%4d,aij);printf(n);45递推小结1)递推是从已知条件开始;2)递推必须有明确的通用公式;3)递推必须是有限次运算。4611.2 递归递归的定义:在一个函数的定义中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。4711.2 递归递归思想:把
20、规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。递归优点:只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。用递归算法编写的程序结构清晰,具有很好的可读性。递归缺点:通过直接的递归过程和函数实现起来,有时效率很差(用递归函数去求1000!)。48递归算法适用在三个场合1)数据的定义形式是递归的,如求n!;2)数据之间的逻辑关系(即数据结构)是递归的,如树、图等的定义和操作;3)某些问题虽然没有明显的递归关系或结构,但问题的解法是不断重复执行一种操作,只是问题规模
21、由大化小,直至某个原操作(基本操作)就结束。例如:汉诺塔问题。49递归设计的要件在函数中必须有直接或间接调用自身的语句;(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口(或递归边界)。50编写递归算法程序时,首先要对问题的以下三个方面进行分析:u决定问题规模的参数。需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?u问题的边界条件及边界值。在什么情况下可以直接得出问题的解?-问题的边界条件及边界值。u解决问题的通式。把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?-解决递归问题的难点,把
22、这些步骤或等式确定下来。51递归设计实例1-哈诺(HanoiHanoi)塔问题:1)1)相传在古代印度的 Bramah Bramah 庙中,有位僧人整天把三根柱子上的金盘倒来倒去,原来他是想把6464个一个比一个小的金盘从一根柱子上移到另一根柱子上去。2)2)移动规则:每次只允许移动一只盘,大盘不得落在小盘上面。3)3)如以每秒移动一只盘子,按照上述规则将6464只盘子从一个柱子移至另一个柱子上,所需时间约为58005800亿年。52先从最简单的情况开始分析,理出思路。1、在 A 柱上只有一只盘子,假定盘号为 1,这时只需将该盘从 A 搬至 C,一次完成,记为:move 1#from A to
23、 C ABC1532、在 A 柱上有 2 只盘子,1 为小盘,2 为大盘。第(1)步将1号盘从A移至B,这是为了让 2号盘能动;move 1#from A to B;第(2)步将 2 号盘从A 移至 C;move 2#from A to C;第(3)步再将 1 号盘从 B 移至 C;move 1#form B to C;ABC21543、在A柱上有3只盘子,从小到大分别为1号,2号,3号第(1)步:将1号盘和2号盘视为一个整体;先将二者作为整体从A移至B,给3号盘创造能够一次移至C的机会。这一步记为 move(2,A,C,B)含义:将上面的2只盘子作为整体从A借助C移至B。第(2)步:将3号盘
24、从A移至C,一次到位。记为 move 3#from A to C第(3)步:处于B上的作为一个整体的2只盘子,再移至C。这一步记为 move(2,B,A,C)含义:将2只盘子作为整体从B借助A移至C。55move(3,A,B,C)move(2,A,C,B)move(1,A,B,C)move(2,B,A,C)ABC213移动3 3个盘子的分解:56move(3,A,B,C)move(2,A,C,B)move(1,A,B,C)move(1,A,C,B)move(1,C,A,B)move(1,A,B,C)move(2,B,A,C)move(1,B,C,A)move(1,B,A,C)move(1,A,
25、B,C)ABC213574、从题目的约束条件看,大盘上可以随便摞小盘,相反则不允许。在将1号和2号盘当整体从A移至B的过程中 move(2,A,C,B)实际上是分解为以下三步第(1).1步:move 1#form A to C;第(1).2步:move 2#form A to B;第(1).3步:move 1#form C to B;58经过以上步骤,将 1 号和 2 号盘作为整体从 A 移至 B,为 3 号盘从 A 移至 C 创造了条件。同样,3号盘一旦到了 C,就要考虑如何实现将 1 号和 2 号盘当整体从 B 移至 C 的过程了。实际上 move(2,B,A,C)也要分解为三步:第(3)
展开阅读全文