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