- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
从前有座山,山里有个老和尚,老和尚对小和尚讲:从前有座山,山里有个老和尚,老和尚对小和尚讲:从前有座山,山里有个老和尚,老和尚对小和尚讲…… 观察下面的函数 function fac2(x:integer):longint; begin if x=1 then fac2:=1 else fac2:=fac2(x-1)*x; end; 递归的概念 递归—— 函数或过程自己直接或间接调用自己! fac函数被称为递归函数(递归公式),为了求fac(n),我们必须先求fac(n-1),为了求fac(n-1),又必须去求fac(n-2),……,为了求fac(2),必须先求fac(1),而fac(1)是已知的。这种定义函数的方式称为递归定义。 观察与思考 递归定义里的参数是如何变化? 边界条件若没有,会如何? S:=Fac(5) 递归 描述递归定义的函数或求解递归问题的过程称为递归算法。 两个条件: 1.递归式(递归关系); 2.递归终止条件。 递归表达式是解题的关键! 例1:求和:sum=1+2+3+…+100 例5、由m个A,n个B组成若干个排列。从某个排列 的位置1开始数,数到任意位置时都能保证A的个数 不少于B的个数,则称该排列为合理排列。例如: 当m=2,n=2时排列有 A A B B(合理) A B A B(合 理)A B B A(不合理) B B A A(不合理) 合理排列数有2 种 输入:只有一行两个整数m,n(1≤n≤m≤12)(用 空格分隔) 输出:一个整数(所有的合理排列数) 【样例】 输入 输出 3 2 5 分析:模拟排队的情况,从第1个人开始,第1 人只能是A,第2个可以是A也可以是B,再其后的人要保证任意位置时都能保证A的个数不少于B的个数,递归生成整个排列。 Var m,n,t:LongInt; Procedure pd(i,j:LongInt); Begin If (i=m) And (j=n) Then t:=t+1{已生成一种排列} Else Begin If im Then ____________{增加1个A} If (jn) And (ji) Then_______________ End; {增加1个B} End; Begin t:=0; Read(m,n);pd(1,0);Writeln(t); End. 递归的缺点 ? 冗余计算造成程序的效率很低。你试过用直接递归的函数计算Fibonacci数列的第50项吗? ? 边界条件设置不当的情况下,经常造成死循环或者内存(系统栈)溢出的窘境,导致递归深度有限。所以,一般递归子程序中不要定义局部数组。 递推算法引入 1、求1+2+3+……+n的和 2、求n! 3、Fibonacci数列 递推定义 对于一个有规律的数列,我们可以借助已知的项,利用特定的关系逐项推算出它的后继项的值,……,如此反复,直到找到所需的那一项为止,这样的方法称为递推算法。 递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。 “递推关系”是一种简洁高效的数学模型,比如经典的Fibonacci数列问题。 ?此类问题中,每个数据项都和它前面的若干个数据项(或后面的若干个数据项)有一定的关联,这种关联一般是通过一个“递推关系式”来表示的。 ?“递推法”是指求解问题时,从初始的一个或若干数据项出发,通过递推关系式逐步推进,从而得到最终结果。 ?初始的若干数据项称为“递推边界”。 解决递推问题有三个重点 一是推导、建立正确的递推关系式; ?二是进一步探讨递推关系式的性质; ?三是如何根据递推关系式编程求解。 顺推法 从已知条件出发,逐步推算出要解决的问题的方法叫顺推。 例: Fibonacci数列大家都非常熟悉,来源于中世纪数学家Fibonacci提出的一个问题:一对刚出生的兔子过两个月后,可以繁殖一对新兔子,问原有雌雄各一只兔子,经过十一个月后,能繁殖多少只兔子。 f(0)=1;f(1)=1;f(3)=2…… f(n)=f(n-2)+f(n-1) 猴子吃桃 第一天,x个桃 第二天,吃一半多一个 第三天,再吃剩下的一半多一个 …… 第十天,发现只剩下一个 问第一天x是多少? Var S,I:longInt; Begin S:=1;{第10天只有一个桃子} For I:=9 DownT
原创力文档


文档评论(0)