清华大学C语言教学课件共个PPT第7个.ppt
- 文档编号:2120330
- 上传时间:2022-10-27
- 格式:PPT
- 页数:53
- 大小:718.50KB
清华大学C语言教学课件共个PPT第7个.ppt
《清华大学C语言教学课件共个PPT第7个.ppt》由会员分享,可在线阅读,更多相关《清华大学C语言教学课件共个PPT第7个.ppt(53页珍藏版)》请在冰豆网上搜索。
青蛙过河青蛙过河快速排序快速排序分书问题分书问题习题讨论习题讨论第七讲第七讲递归算法举例递归算法举例12递递归归算算法法举举例例青蛙过河青蛙过河3讨论问题讨论问题青蛙过河青蛙过河该题是该题是2000年全国青少年信息学奥林匹克的一道试题。
叙述如下:
年全国青少年信息学奥林匹克的一道试题。
叙述如下:
一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积也,面积也只容得下一只青蛙落脚。
有一队青蛙从尺寸上一个比一个小。
我只容得下一只青蛙落脚。
有一队青蛙从尺寸上一个比一个小。
我们将青蛙从小到大,用们将青蛙从小到大,用1,2,n编号。
规定初始时这队青蛙编号。
规定初始时这队青蛙只能趴在左岸的石头只能趴在左岸的石头L上,当然是一个落一个,小的落在大的上上,当然是一个落一个,小的落在大的上面。
不允许大的在小的上面。
在小溪中有面。
不允许大的在小的上面。
在小溪中有S个石柱,有个石柱,有y片荷叶,片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求一个落规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求一个落一个,大的在下,小的在上。
对于荷叶只允许一只青蛙落脚,不一个,大的在下,小的在上。
对于荷叶只允许一只青蛙落脚,不允许多只在其上。
对于右岸的石柱允许多只在其上。
对于右岸的石柱R,与左岸的石柱,与左岸的石柱L一样允许一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。
当青蛙多个青蛙落脚,但须一个落一个,小的在上,大的在下。
当青蛙从左岸的从左岸的L上跳走后就不允许再跳回来;同样,从左岸上跳走后就不允许再跳回来;同样,从左岸L上跳至上跳至右岸右岸R,或从溪中荷叶或溪中石柱跳至右岸,或从溪中荷叶或溪中石柱跳至右岸R上的青蛙也不允许上的青蛙也不允许再离开。
问在已知溪中有再离开。
问在已知溪中有S根石柱和根石柱和y片荷叶的情况下,最多能跳片荷叶的情况下,最多能跳过多少只青蛙?
过多少只青蛙?
4这题看起来较难,但是如果我们认真分析,理出思路,就可化这题看起来较难,但是如果我们认真分析,理出思路,就可化难为易。
难为易。
思路:
思路:
11、简化问题,探索规律。
先从个别再到一般,要善于对多个、简化问题,探索规律。
先从个别再到一般,要善于对多个因素作分解,孤立出一个一个因素来分析,化难为易。
因素作分解,孤立出一个一个因素来分析,化难为易。
2.2.定义函数定义函数Jump(S,y)Jump(S,y)最多可跳过河的青蛙数最多可跳过河的青蛙数其中:
其中:
SS河中柱子数河中柱子数yy荷叶数荷叶数53.先看简单情况,河中无柱子:
先看简单情况,河中无柱子:
S=0,Jump(0,y)当当y=1时,时,Jump(0,1)=2;说明:
河中有一片荷叶,可以过两只青蛙,起始时说明:
河中有一片荷叶,可以过两只青蛙,起始时L上有两上有两只青蛙,只青蛙,1#在在2#上面。
上面。
第一步:
第一步:
1#跳到荷叶上;跳到荷叶上;第二步:
第二步:
2#从从L直接跳至直接跳至R上;上;第三步:
第三步:
1#再从荷叶跳至再从荷叶跳至R上。
上。
如下图:
如下图:
6当当y=2时,时,Jump(0,2)=3;说明:
河中有两片荷叶时,可以过说明:
河中有两片荷叶时,可以过3只青蛙。
起始时:
只青蛙。
起始时:
1#,2#,3#3只青蛙落在只青蛙落在L上,上,第一步:
第一步:
1#从从L跳至叶跳至叶1上,上,第二步:
第二步:
2#从从L跳至叶跳至叶2上,上,第三步:
第三步:
3#从从L直接跳至直接跳至R上,上,第四步:
第四步:
2#从叶从叶2跳至跳至R上,上,第五步:
第五步:
1#从叶从叶1跳至跳至R上,上,采用归纳法:
采用归纳法:
Jump(0,y)=y+1Jump(0,y)=y+1;意思是:
在河中没有石柱的情意思是:
在河中没有石柱的情况下,过河的青蛙数仅取决于荷况下,过河的青蛙数仅取决于荷叶数,数目是荷叶数叶数,数目是荷叶数+1+1。
7再看再看Jump(S,y)Jump(S,y)先看一个最简单情况:
先看一个最简单情况:
S=1,y=1。
从图上看出需要从图上看出需要99步,跳过步,跳过44只青蛙。
只青蛙。
1#1#青蛙从青蛙从LLYY;2#2#青蛙从青蛙从LLSS;1#1#青蛙从青蛙从YYSS;3#3#青蛙从青蛙从LLYY;4#4#青蛙从青蛙从LLRR;3#3#青蛙从青蛙从YYRR;1#1#青蛙从青蛙从SSYY;2#2#青蛙从青蛙从SSRR;1#1#青蛙从青蛙从YYRR;8ttLLSSYYRRL4L4L3L3L2L2L1L1S2S2S1S1R4R4R3R3R2R2R1R10011223344556677889944444444443333333322221122222222221111111111331111444444444433333333222211表一表一9为了将过河过程描述得更清楚,我们给出了表为了将过河过程描述得更清楚,我们给出了表11。
表中。
表中L1L2L1L2L3L4L3L4表示左岸石柱上落在一起的青蛙的高度位置。
表示左岸石柱上落在一起的青蛙的高度位置。
L1L1在在最上面,最上面,L4L4在最下面的位置。
引入这个信息就可比较容易在最下面的位置。
引入这个信息就可比较容易地看出对青蛙占位的约束条件。
同理地看出对青蛙占位的约束条件。
同理R1R2R3R4R1R2R3R4也是如此。
也是如此。
对水中石柱对水中石柱SS,也分成两个高度位置,也分成两个高度位置S1S2S1S2。
对荷叶。
对荷叶YY无须分无须分层,因为它只允许一只青蛙落在其上。
层,因为它只允许一只青蛙落在其上。
t=0t=0为初始时刻,青为初始时刻,青蛙从小到大落在石柱蛙从小到大落在石柱LL上。
上。
t=1t=1为第一步:
为第一步:
1#1#从从LL跳至荷叶跳至荷叶YY上;上;LL上只剩上只剩2#3#4#2#3#4#。
T=2T=2为第二步;为第二步;2#2#从从LL跳至石柱跳至石柱SS上,上,处在处在S2S2位置上,位置上,LL上只剩上只剩3#3#和和4#4#。
T=3T=3为第三步,为第三步,1#1#从从YY跳至跳至SS,将,将YY清空。
这时你看,清空。
这时你看,SS上有上有1#1#、2#2#,LL上有上有3#3#、4#4#,好,好象是原来在象是原来在LL上的上的44只青蛙,分成了上下两部分,上面的只青蛙,分成了上下两部分,上面的22只只通过荷叶通过荷叶yy转移到了转移到了SS上。
这一过程是一分为二的过程。
即上。
这一过程是一分为二的过程。
即将将LL上的一队青蛙,分解为两个队,每队各二只,且将上面上的一队青蛙,分解为两个队,每队各二只,且将上面的二只转移到了的二只转移到了SS上。
这是我们可以考虑形成两个系统,一上。
这是我们可以考虑形成两个系统,一个是个是LL,YY,RR系统,一个是系统,一个是SS,YY,RR系统。
前者二只青蛙号系统。
前者二只青蛙号大;后者二只青蛙号小。
先跳号大的,再跳号小的。
从第大;后者二只青蛙号小。
先跳号大的,再跳号小的。
从第五步到第九步可以看出的确是这么做的。
五步到第九步可以看出的确是这么做的。
10对于对于LYRLYR系统,相当于系统,相当于Jump(0,1)Jump(0,1)对于对于SYRSYR系统,相当于系统,相当于Jump(0,1)Jump(0,1)两个系统之和为两个系统之和为2*Jump(0,1)2*Jump(0,1),因此有:
因此有:
Jump(1,1)=2*Jump(0,1)=2*2=4Jump(1,1)=2*Jump(0,1)=2*2=4。
现在再看现在再看S=2S=2,y=1Jump(2,1)y=1Jump(2,1)我们将河中的两个石柱称作我们将河中的两个石柱称作S1S1和和S2S2,荷叶叫荷叶叫yy,考虑先将,考虑先将LL上的青蛙的一半上的青蛙的一半借助于借助于S2S2和和yy转移到转移到S1S1上,当然是一上,当然是一半小号的青蛙在半小号的青蛙在S1S1上,大的留在上,大的留在LL上。
上。
11这样这样LS1S2yR系统分解为系统分解为:
(LS2yRLS2yR系统)系统)+(S1S2yRS1S2yR系统)系统)=2*=2*(LS2yRLS2yR系统)系统)=2*Jump(1,1)=2*Jump(1,1)用归纳法用归纳法Jump(S,y)=2*Jump(S-1,y)Jump(S,y)=2*Jump(S-1,y)125.将上述分析出来的规律写成递归形式的与或结点图为:
将上述分析出来的规律写成递归形式的与或结点图为:
13举例:
S=3,y=4,算Jump(3,4)14#include/预编译命令预编译命令intJump(int,int);/声明有被调用函数声明有被调用函数voidmain()/主函数主函数/主程序开始主程序开始ints,y,sum;/整型变量整型变量,s为河中石柱数为河中石柱数,y为荷叶数为荷叶数printf(请输入石柱数请输入石柱数s=);/提示信息提示信息scanf(%d,&s);/输入正整数输入正整数sprintf(请输入荷叶数请输入荷叶数y=);/提示信息提示信息scanf(%d,&y);/输入正整数输入正整数ysum=Jump(s,y);/Jump(s,y)为被调用函数为被调用函数printf(“Jump(%d,%d)=%dn,s,y,sum);/输出结果输出结果/主程序结束主程序结束/以下函数是被主程序调用的函数以下函数是被主程序调用的函数intJump(intr,intz)/整型自定义函数整型自定义函数,r,z为形参为形参/自定义函数体开始自定义函数体开始intk;/整型变量整型变量if(r=0)/如果如果r为为0,则为直接可解结点则为直接可解结点,k=z+1;/直接可解结点直接可解结点,k值为值为z+1else/如果不为如果不为1,则要调用则要调用Jump(r-1,z)k=2*Jump(r-1,z);/计算计算Jump(r-1,z)再乘以再乘以2赋给赋给kreturn(k);/将将k的值返回给的值返回给Jump(s,y)/自定义函数体结束自定义函数体结束15递递归归算算法法举举例例快速排序快速排序16快速排序的思路:
快速排序的思路:
11、将待排序的数据放入数组、将待排序的数据放入数组aa中,下标从中,下标从ll到到rr;22、取、取alal放变量放变量kk中,通过由右、左两边对中,通过由右、左两边对kk的大小的大小的比较,为的比较,为kk选择应该排定的位置。
这时要将比选择应该排定的位置。
这时要将比kk大大的数放右边,比的数放右边,比kk小的数放左边。
当小的数放左边。
当kk到达最终位置到达最终位置后,由后,由kk划分了左右两个集合。
然后再用同样的思划分了左右两个集合。
然后再用同样的思路处理左集合与右集合。
路处理左集合与右集合。
33、令、令sort(l,r)sort(l,r)为将数组元素从下标为为将数组元素从下标为ll到下标为到下标为rr的的r-l+1r-l+1个元素从小到大排序。
个元素从小到大排序。
17我们画出与或图来阐述快速排序的思路:
我们画出与或图来阐述快速排序的思路:
18分区处理:
分区处理:
11、让、让k=alk=al22、将、将kk放在放在amam33、使、使al,al+1,al,al+1,am-1=am,am-1=am44、使、使amam+1,am+2,am=rl=r,则什么也不做。
这是直接可解,则什么也不做。
这是直接可解结点。
结点。
CC结点是在结点是在lrlr情况下情况下AA结点的解。
结点的解。
C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 清华大学 语言 教学 课件 PPT
![提示](https://static.bdocx.com/images/bang_tan.gif)