递归函数.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
递归函数

递归函数 用递归函数实现求n!。 解决求n!有两种方法: 递推法 在学习循环时计算n!采用的就是递推法: n!= 1*2*3*……*n 通过循环实现: for(result = 1, i = 1; i n; i++) result = result * i 递归法 把n!以递归方式进行定义: n*(n-1)! 当n>1 1 当n=1或n=0 即求n!可以在(n-1)!的基础上再乘上n。如果把求n!写成函数fact(n)的话,则fact(n)的实现依赖于fact(n-1)。 源程序 include stdio.h double fact(int n); /* 函数声明 */ void main() { int n; scanf(%d, n); printf(%f, fact(n)); /* 函数调用 */ } double fact(int n) { double result; if(n == 1 || n == 0) /* 递归出口 */ result = 1; else result = n * fact(n-1); /* 函数递归调用 */ return result; } 递归函数fact()中必须定义保存运算结果的变量result = n * fact(n-1),然后通过return result 返回n!的结果。 千万不能写成fact(n) = n*fact(n-1),因为从赋值表达式语法规则上说,赋值号左边必须是变量,fact(n)表示的是函数调用,这是初学者较容易犯的错误。 读者对fact(n)定义也许会觉得不完整,因为fact(n-1)还不知道,result无法算出。这里需要区分程序书写与程序执行。就像循环程序并不是把所有的循环体语句重复书写,只是给出执行规律,具体执行由计算机去重复。递归函数同样给出的是执行规律,至于fact(n-1)如何求得,应由计算机按照给出的规律自行计算。 下面看一下递归函数的执行过程,以帮助我们更好地理解递归函数。 下图给出了计算fact(4)的调用过程。数字①~⑧是递归函数调用返回的顺序编号。首先main()函数以4作参数调用fact(), fact(4)依赖于fact(3)的值,所以必须先计算出fact(3)才能求fact(4)。当fact(4)递归调用自己计算fact(3)时,fact(4)并未结束,而是暂时停一下,等算出fact(3)后再继续计算fact(4),这时计算机内部main()、fact(4)和fact(3) 3个函数同时被执行,fact(3)是fact(4)的克隆体,尽管程序代码、变量名相同,但属不同的函数体、不同参数、不同变量。这样依次递归,当调用到fact(1)时,同时有5个函数被运行着,各个克隆的fact()均未结束,只有当n=1,fact(1)=1时,不必再继续递归调用下去。有了fact(1)的确切值,就可以计算fact(2),不断返回,不断结束原来递归克隆的函数,最后可以计算出fact(4),返回到主函数。 void main() { …… printf (%f, fact (4) ) ; …… } fact()函数的调用返回过程 从实现过程上看,fact()不断调用自己,如果没有终结的话会发生死机,就像循环没有结束条件会导致死循环那样。任何递归函数都必须包含条件,来判断是否要递归下去,一旦结束条件成立,递归克隆应该不再继续,以某个初始值作为函数结果,然后返回,结束一个递归克隆函数体。通过一层层的返回,一层层地计算出i!(i = 1,2,…,n-1),最终算出n!。 递归的实质是把问题简化成形式相同、但较简单一些的情况,程序书写时只给出统一形式,到运行时再展开。程序中每经过一次递归,问题就得到一点简化,比如把n!的计算简化成对(n-1)!的计算,不断的简化下去,最终归结到一个初始值,就不必再递归了。 fact(1) { if (n= =1) res=1; return res ; } ③递归调用 ④递归调用 ⑤递归返回 ⑧函数返回 fact(2) { …… res=2*fact(1) …… } ⑥递归返回 ⑦递归返回 fact(3) { …… res=3*fact(2) …… } ②递归调用 ①函数调用 fact(4) { …… res=4*fact(3) …… } n!=

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档